c - 在编译时知道 for 循环的迭代次数是否有优势?

标签 c optimization opencl

在编译时知道应该对 for 循环执行多少次迭代有什么好处吗?

例如,在某些情况下,编译器能否生成运行速度更快的可执行文件:

#define ITERATIONS 10
int foo()
{
    for (int i=0; i < ITERATIONS; i++){
        do_something();
    }
}

比给定的:

int foo(int iterations)
{
    for (int i=0; i < iterations; i++){
        do_something();
    }
}

如果这不是普遍情况,那是什么情况?

我关心的是 OpenCL 的特定情况,所以我也想知道这是否与 C 不同。

最佳答案

我使用 GCC 在相当现实的情况下进行了测试。当循环数在编译时已知时,我得到这个:

.L2:
    call    do_something
    subl    $1, %ebx
    jne .L2

如果不是,我得到这个:

.L6:
    call    do_something
    addl    $1, %ebx
    cmpl    %ebp, %ebx
    jne .L6

因此,它能够通过更改为递减计数到零循环而不是递增计数循环来稍微更好地优化固定迭代次数。如果不出意外,这会使用更少的代码缓存。

通过更高的优化级别,它完全展开了一个调用外部函数十次的循环。据推测,除非它认为这样做更好,否则它不会这样做。如果迭代次数未知,它肯定不能这样做。

简短回答:固定的迭代次数为编译器提供了更多选择。至少在某些时候,这应该会产生稍微好一点的代码。

关于c - 在编译时知道 for 循环的迭代次数是否有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12954157/

相关文章:

c++ - Windows 多任务破坏了 OpenCL 性能

c - Lua C API : undefined reference errors in liblua.a

c - 如何在 C 中设置 GNUPLOT 线的颜色

javascript - Chrome Profiler 中的 "Not optimized"警告是什么意思?

c++ - 使用 -g gcc 标志编译的程序是否比不使用 -g 编译的同一程序慢?

opencl - 使用 OpenCL 或其他 GPGPU 框架在现代 x86 硬件上的 CPU 和 GPU 之间共享数据

c - 缺少原型(prototype)错误

c - fscanf 没有将字符串读入数组

python - Tensorflow "know"何时不将数据放入 GPU?

python - PyOpenCL 与 Python 多处理?