假设有四个具有不同循环计数器和条件的嵌套循环。有什么方法可以告诉编译器(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/