为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=E[I+1],我也添加了+2和+3,但这似乎并没有解决它:/这是如何工作的?数组[k]+=j=E[I]continue始终为真呢?你得到了无限的循环,继续跳过太远。如果jfor (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; }