c - 如何使 C 编译器将所有嵌套循环转换为单个循环

标签 c gcc clang compiler-optimization icc

假设有四个具有不同循环计数器和条件的嵌套循环。有什么方法可以告诉编译器(icc、gcc 和 clang)将所有循环转换为一个循环?

N=128; M=128; P=3; Q=3; //All these variables are constant
for (n=0; n<N; n++){
    for(m=0; m<M; m++){
        temp=0;
        for(p=0; p<P; p++){ 
            for(q=0; q<Q; q++){
                temp += kernel[p][q] * input[n+p][m+q];
            }
        }
        output[n][m]=temp;
    }
}

转化为:

for(;;)
    //computations...

根据我的经验,这在您依赖自动矢量化时很有用。如果有一种方法可以转换这两个嵌套循环,那也可以。解决了一些问题 this question但手写代码。我有一个程序,你可以看到它here在神 bolt 中。

最佳答案

我不知道你为什么想要,但你可以手动完成。

int accumulator;
for (int i=0; i<N*M*P*Q; ++i) {
    int n = i;
    int q = n % Q;  n /= Q;
    int p = n % P;  n /= P;
    int m = n % M;  n /= M;

    if (!p && !q)
       accumulator = 0;

    accumulator += kernel[p][q] * input[n+p][m+q];

    if (!p && !q)
        output[n][m] = accumulator;
}

两个循环更有意义。

for (int i=0; i<N*M; ++i) {
    int n = i / M;
    int m = i % M;

    int accumulator = 0;
    for (int j=0; j<P*Q; ++j) {
        int p = j / Q;
        int q = j % Q;
        accumulator += kernel[p][q] * input[n+p][m+q];
    }    

    output[n][m] = accumulator;
}

关于c - 如何使 C 编译器将所有嵌套循环转换为单个循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394205/

相关文章:

c - 进程与信号同步

c - 打印的是垃圾值吗?

c - 使用函数或指向函数的指针之间有什么区别吗?

c - 如何使用 gcc asm 关键字在寄存器中传递函数参数

c++ - ld : library not found for -lbitcoin

c - llvm:如何生成避免基于 RIP 的寻址模式的 x64 代码?

c++ - 在 NetBeans 中集成 Clang?

计算 int 中的位数 - 为什么这段代码有效?

macos - ld OS X : unknown option -z

c - AMD64——nopw 汇编指令?