首页 > 解决方案 > 如何在两个 for 循环中的第一个之后摆脱初始化?

问题描述

我有一个当前形式为的 for 循环

for (i=0; i<N; i++) {
   y = 0.;
   for (j=0; j<N; j++)
      y += ...
}

我想把它改写为

for (i=0; i<N; i++) {
   for (j=0; j<N; j++)
      y += ...
}

其中 y 在某个先前点被初始化,使得两个 for 循环被折叠。有没有办法做到这一点?这是以下 OpenMP 教程第 16.4 节的练习

标签: c++cfor-loopparallel-processingopenmp

解决方案


这与您链接到的代码不同。原来有y索引,即它是一个数组:

for (i=0; i<N; i++) {
   y[i] = 0.;
   for (j=0; j<N; j++)
      y[i] += ...
}

这可以重写为:

for (i=0; i<N; i++)
  y[i] = 0.;

for (i=0; i<N; i++)
  for (j=0; j<N; j++)
    y[i] += ...
}

在你的情况下,y是标量。外循环的每次迭代都会在内循环之前将其值重置为 0。如果内部循环中没有副作用,则只有外部循环的最后一次迭代才重要,您可以简单地摆脱它:

i = N-1;
y = 0.;
for (j=0; j<N; j++)
  y += ...

推荐阅读