Hen*_*all 1 c optimization opencl
在编译时知道for循环应该进行多少次迭代是否有一些优势?
例如,在某些情况下,编译器可以生成一个可执行程序,运行速度更快,因为:
#define ITERATIONS 10
int foo()
{
for (int i=0; i < ITERATIONS; i++){
do_something();
}
}
Run Code Online (Sandbox Code Playgroud)
比这个:
int foo(int iterations)
{
for (int i=0; i < iterations; i++){
do_something();
}
}
Run Code Online (Sandbox Code Playgroud)
如果情况不是普遍的话,那些情况是什么?
我关注的是OpenCL的具体情况,所以我也有兴趣知道这是否与C不同.
我使用GCC在相当现实的情况下进行了测试.当编译时已知循环数时,我得到:
.L2:
call do_something
subl $1, %ebx
jne .L2
Run Code Online (Sandbox Code Playgroud)
如果不是,我得到这个:
.L6:
call do_something
addl $1, %ebx
cmpl %ebp, %ebx
jne .L6
Run Code Online (Sandbox Code Playgroud)
因此,通过将计数降低到零循环而不是向上计数循环,它能够稍微优化固定的迭代次数.如果不出意外,这会使用更少的代码缓存.
具有更高的优化级别,它完全展开一个调用外部函数十次的循环.据推测,除非它认为它更好,否则它不会那样做.如果迭代次数未知,肯定不能这样做.
简短回答:固定的迭代次数为编译器提供了更多选择.至少在某些时候,这应该会产生非常好的代码.