依赖嵌套循环的并行化

时间:2021-07-30 02:32:15

标签: c++ loops parallel-processing openmp

我的目标是在 C++ 上计算一个简单的 N 体程序,我正在使用 OpenMP 来加快计算速度。在某些时候,我有看起来像这样的嵌套循环:

int N;
double* S          = new double[N];
double* Weight     = new double[N];
double* Coordinate = new double[N];
 ...

#pragma omp parallel for
for (int i = 0; i < N; ++i)
{
   for (int j = 0; j < i; ++j)
   {
       double K = Coordinate[i] - Coordinate[j];
       S[i]    += K*Weight[j];
       S[j]    -= K*Weight[i];
   }
}

这里的问题是我在删除 #pragma 时没有获得完全相同的结果......我猜这与第二个循环依赖于整数 i 的事实有关,但我没有看看如何解决这个问题

1 个答案:

答案 0 :(得分:1)

问题在于更新 S[i]S[j] 期间存在数据竞争。不同的线程可能同时读取/写入数组的同一元素,因此它应该是一个原子操作(您必须添加#pragma omp atomic)以避免数据竞争并确保内存一致性:

for (int j = 0; j < i; ++j)
{
    double K = Coordinate[i] - Coordinate[j];
    #pragma omp atomic
    S[i]    += K*Weight[j];    
    #pragma omp atomic
    S[j]    -= K*Weight[i];
}