【问题标题】: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 += ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      相关资源
      最近更新 更多