C++ OpenMP:并行更新阵列时是否总是需要减少阵列?

C++ OpenMP:并行更新阵列时是否总是需要减少阵列?,c++,multithreading,parallel-processing,openmp,reduction,C++,Multithreading,Parallel Processing,Openmp,Reduction,我是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)

我是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);
            }
        }
    }
}
double-rij[3];
双r;
#ifdef\u OPENMP
#专用pragma omp并行(rij,r)
#恩迪夫

对于(int i=0;i您不需要缩减。这是一项功能,可以避免重复复制相同的代码,因为它们是重复出现的问题(请尝试思考,在没有OpenMP的情况下如何实现求和缩减)


您现在所做的是处理并行数据(
V[i]
),这些数据在任何迭代中都不应该重叠(如您在问题中所述),因为您要除以
i
本身
也不应该重叠,因为它只取决于
i
k

此代码已被破坏。“r”和“rij”的值在并行区域内未定义。我认为您希望共享这些值(除非距离通过引用写入它们;在这种情况下,将它们声明在正确的范围内!)是的,很抱歉,代码不是开箱即用的,只是为了说明我的观点。
distance
函数将
r
rij
作为
i
j
的函数写入,因此我希望它们是私有的。然后在它们的最小范围内声明它们,以明确说明这一点,这样您就不必重复这并不是说在内部作用域中声明变量是一项新功能!