【发布时间】:2017-09-24 19:49:33
【问题描述】:
假设有四个具有不同循环计数器和条件的嵌套循环。有没有办法告诉编译器(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但使用手写代码的事情。我有一个程序,你可以在 Godbolt 中看到它here。
【问题讨论】:
-
如何将其转换为单个循环?您期望发生什么魔术,以某种方式让编译器自行减少 N*M*P*Q 计算?如果不能,为什么要这样做?
-
如果可以转换两个也可以工作的嵌套循环。
-
-funroll-all-loops? -
@MarkWeston 这通常不会降低性能吗?我认为 OP 想要增加。
-
不,我不希望
--funroll-all-loops做 OP 要求的事情。首先,该选项中的“全部”是关于哪些循环是展开的候选——它们包括迭代次数不能完全确定为编译时间的循环。并非所有候选循环都已展开。其次,如果它确实展开了所有循环,那么 OP 将留下零个循环,而不是一个。
标签: c gcc clang compiler-optimization icc