我正在尝试使用 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/