为C++中的循环嵌套展开
如何展开以下嵌套循环为C++中的循环嵌套展开,c++,optimization,loops,C++,Optimization,Loops,如何展开以下嵌套循环 for(k = begin; k != end; ++k) { for(j = 0; j < Emax; ++j) { for(i = 0; i < N; ++i) { if (j >= E[i]) continue; array[k] += foo(i, tr[k][i], ex[j][i]); } } } 我尝试了以下操作,但我的输出不一样,应该是: for(k = begin; k != end; ++k) { for
for(k = begin; k != end; ++k) {
for(j = 0; j < Emax; ++j) {
for(i = 0; i < N; ++i) {
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]);
}
}
}
我尝试了以下操作,但我的输出不一样,应该是:
for(k = begin; k != end; ++k) {
for(j = 0; j < Emax; ++j) {
for(i = 0; i+4 < N; i+=4) {
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]);
array[k] += foo(i+1, tr[k][i+1], ex[j][i+1]);
array[k] += foo(i+2, tr[k][i+2], ex[j][i+2]);
array[k] += foo(i+3, tr[k][i+3], ex[j][i+3]);
}
if (i < N) {
for (; i < N; ++i) {
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]);
}
}
}
}
我将使用Intel的TBB并行运行此代码,以便它利用多核。运行完之后,另一个函数会打印出数组[]中的内容,现在,在展开时,输出不完全相同。感谢您的帮助
更新:我修好了。我用这个问题的答案展开。。。输出不匹配,因为我没有执行数组[k]=0;在第一个for循环之后
谢谢,
赫里斯托
对
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]);
筛选条件不同
筛选和消除分支的更好方法:
array[k] += (j < E[i])*foo(i, tr[k][i], ex[j][i]);
另外,您需要保证N可以被4整除,否则您可能会超调。或者,将N截断为可被四个N-N%4整除,我认为如果j>=E[I]继续;这是你的问题。在原始版本中,此测试针对每个索引i运行。在展开的版本中,它只针对每四个索引进行测试。请尝试以下操作:
for (i = 0; i < N; /*advanced in loop*/) {
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
}
while (i < N) {
if (j >= E[i]) {
++i; // missing in original version
continue;
}
array[k] += foo(i, tr[k][i], ex[j][i]);
++i;
}
编辑:我忘了在原始版本中增加一个索引,当j>=E[I]时,该索引会导致一个无限循环。这就是为什么我在第三个for循环之后添加了if I
for (i = 0; i < N; /*advanced in loop*/) {
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
if (j >= E[i]) continue;
array[k] += foo(i, tr[k][i], ex[j][i]); ++i;
}
while (i < N) {
if (j >= E[i]) {
++i; // missing in original version
continue;
}
array[k] += foo(i, tr[k][i], ex[j][i]);
++i;
}