|
在CCS开发环境中,开启-O2/-O3优化选项,编译器将自动为合适的代码进行软件流水编排,因此编程者需要注意的是使设计的循环体符合软件流水编排的条件。
下列一些因素将可能引起软件流水编排失败:
汇编语句嵌入到C/C++代码中
出现复杂的流控制语句如goto、break等
循环中包含一个调用(内嵌函数除外)
需进行软件流水编排的指令太多
没有初始化循环计数器
循环变量在循环过程中被修改
软件流水被关闭:没有使用-O2或-O3选项;使用了-ms2或-ms3选项;使用-mu关闭了软件流水
理解编译器反馈信息
1. 编译器优化循环的几个步骤
循环的运算性能主要取决于编译器能否编排出恰当的软件流水,编译器优化一个循环的过程大致分为三个步骤:
获取循环次数信息。这些信息能帮助编译器判断是否要对循环做自动展开等操作。有时编译器无法从代码中获得完整的这些信息,编译器将会对循环采取保守的优化策略。因此,若要获得最佳的优化性能,编程者应尽可能地提供这些信息给编译器,可通过 MUST_ITERATE 、UNROLL 等 pragma语句。
几个关键参数如下:
最小可能循环次数(Minimum Trip Count)
最大可能循环次数(Maximum Trip Count)
循环倍数系数(Max Trip Count Factor)
收集循环资源和相关图信息。CPU完成一次循环迭代所需的cycle数称为迭代间隔(iteration interval,ii),编译器的优化目标就是最小化ii。
几个关键参数如下:
循环执行相关限(Loop Carried Dependency Bound),指循环体中最大的一条依赖路径的距离,而所谓依赖是指当前指令的开始依赖于前面指令的结束。
以下面一段代码为例:
void simple_sum(short *sum, short *in1, unsigned int N)
{
int i;
for (i = 0; i < N; i++)
{
sum[i] = in1[i] + 1;
}
}
|
|