【问题标题】:How to configure openMP for nested loops to keep the inner loop not parallelized?如何为嵌套循环配置 openMP 以保持内部循环不并行化?
【发布时间】:2012-04-07 07:29:15
【问题描述】:

我有以下嵌套的 for 循环。我想并行化第一个循环,但不能并行化第二个循环。所以我希望每个线程自己执行第二个循环,这意味着第二个循环对于每个线程必须是特殊的(对于代码中的每个“i”)。

我该怎么做?

#pragma omp parallel for
    for (i=k+1;i<row;i++){
        for (n=0;n<k;n++){
           // #pragma omp atomic
            dummy += L[i][n]*L[k][n];
            L[i][k] = (A[i][k] - dummy)/L[k][k];
        }
        dummy = 0;
    }

【问题讨论】:

  • 不会,并行 for 适用于下一个 for 循环,但不适用于后续 ...
  • 但结果证明这个循环是错误的。第二个循环必须受到来自多个线程的某种形式的干预。

标签: c++ parallel-processing openmp


【解决方案1】:

omp parallel for pragma 仅适用于紧随其后的循环。 i 循环将分布在线程之间。在i 的每次迭代中,n 循环将在同一线程上执行。您的代码已经完成了您正在尝试做的事情。

【讨论】:

  • 谢谢。但结果却完全不同,所以我认为在第二个循环中应该有多个线程。
  • 好吧,您使用 omp atomic 的直觉是正确的 - 您正在更新共享变量 dummy。不过,您应该为此使用 OpenMP 缩减子句。
  • 经过仔细检查,您的虚拟变量仅在迭代中使用,因此我将在外循环中声明它并将其设置为 0,然后在内循环开始之前。不需要原子编译指示。
  • 谢谢。我按照您的建议修改了代码。但结果仍然不同。
  • 另一件事 - n 循环变量当前定义在外循环之外,这使得它在线程之间共享。您应该将其定义为 for 循环的一部分(这是首选的 C++ 样式)或就在内部循环之前。这很可能是问题的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2015-02-05
相关资源
最近更新 更多