OpenMP:并行更新数组是否总是需要数组缩减?

OpenMP: Is array reduction always needed for updating an array in parallel?

我对 OpenMP 很陌生。我有以下简单循环,我想 运行 与 OpenMP 并行:

double rij[3];
double r;

#ifdef _OPENMP
#pragma omp parallel for private(rij,r)
#endif
for (int i=0; i<n; ++i)
{
    for (int j=0; j<n; ++j)
    {
        if (i != j)
        {
            distance(X,rij,r,i,j);

            V[i] += ke * Q[j] / r;

            for (int k=0; k<3; ++k)
            {
                F[3*i+k] += ke * Q[j] * rij[k] / pow(r,3);
            }
        }
    }
}

据我了解,默认情况下变量是共享的,这就是我只声明 private(rij,r) 的原因。但是根据这些问题(first second ),我应该在这种情况下进行数组缩减。

我很清楚,如果许多线程需要求和到同一个变量,则必须使用 #pragma omp parallel for reduction(+:A[:n]) 来求和到大小为 n 的数组 A。这是我在代码的另一部分所做的,它按预期工作。

但是,在这种情况下,worker 永远不必对同一个变量求和:每个 worker 对其索引 i 执行求和。像我在这种情况下所做的那样是正确的,即不进行任何数组缩减并且不使用任何关键部分?

如果我的实现是正确的,我相信它会避免临界区的开销,同时是更简单的代码。请随时就如何更好地优化它提出您的建议。

谢谢

你不需要减少。这是一个避免重复复制相同代码的功能,因为它们是重复出现的问题(试着想一想,如果没有 OpenMP,你将如何实现总和减少)。

您现在所做的是处理并行数据 (V[i]),它不应在任何迭代中重叠(如您在问题中所述),因为您除以 i 本身。此外写入 F[...] 也不应该重叠,因为它只取决于 ik