【问题标题】:How to get rid of initialization after first of two for-loops?如何在两个 for 循环中的第一个之后摆脱初始化?
【发布时间】:2021-02-14 02:54:38
【问题描述】:
我有一个当前形式为 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 循环就被折叠了。有没有办法做到这一点?这是following OpenMP tutorial 的第 16.4 节中的练习
【问题讨论】:
标签:
c++
c
for-loop
parallel-processing
openmp
【解决方案1】:
这与您链接到的代码不同。原始有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 += ...