c++ - 使用 openmp 无法达到所需的速度

标签 c++ c openmp

我正在尝试使用 openmp 指令来并行化一段代码,但无法实现任何加速。以下是我尝试并行化的代码片段:

#pragma omp parallel private(i,j) shared(a,x,n) default(none)
{
  for(j=n-1;j>=0;j--)
  {
    x[j] = A(j,n,n)/A(j,j,n);
   #pragma omp for schedule(dynamic)
    for (i=0;i<=j-1;i++)
    {
      A(i,n,n )= A(i,n,n) - A(i,j,n)*x[j];
    }
 }
}

n的值为1000。A(i,n,n)是定义的宏,用于访问数组a。 当我增加线程数量时,执行时间会增加或保持不变。我正在使用的机器有 4 个核心。令我惊讶的是,即使线程数为 2,速度也没有提高。 我无法弄清楚我做错了什么?

最佳答案

由于n>>#CPUs(我不认为你有1000个CPU),并行化内部循环是不明智的。在您的示例中,您在每次迭代时重新分配工作。 相反,并行化外循环是更明智的做法。这样,x[j] 的值不会由不同线程同时更新(如 Zulan 提到的),并且您将需要更少的工作重新分配。 在这种情况下,使用动态调度是明智的,因为每次迭代的工作量都会发生变化。

  • 注意:您必须更改计算顺序,当前实现不允许您将并行化移动到外循环,因为所有线程都将更新相同的值 (A[i][ n][n])。

虽然创建线程确实需要时间,但线程不会在每次迭代时重新创建。它们仅在顶部 #pargma 语句上创建一次,并为整个后续子句同时运行。

关于c++ - 使用 openmp 无法达到所需的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43337118/

相关文章:

c++ - boost ptime : how to format data in a way browsers send inside headers of http requests?

c++ - 具有长文件路径的 MCIWindow

c - 我应该使用什么预处理器指令或其他方法来辨别 32 位和 64 位环境?

close() 可以阻止执行一段时间吗?

char* 与 char(*)[100] 的间接级别不同

c++ - 为什么我们不能有非常量类级别的静态变量?

c++ - 奇怪的段错误

c++ - OpenMP - Easy Loop,但仍然是无限的?

c - 嵌套循环、内循环并行化、重用线程

openmp - 使用 Qt creator 时如何开启 OpenMP