openmp共享和私人成员

时间:2015-10-10 15:34:47

标签: variables openmp private shared

我试图简单地将一个MD代码与openmp并行。但是,即使我使用openmp的一个线程。结果不正确。如果我赞扬代码的omp部分结果是正确的。我认为问题是在omp中错误使用共享和私有变量。任何人都可以帮我解决这个问题吗?非常感谢你!代码如下

int i, j;
// parallelization using openmp
#pragma omp parallel shared(fx2,fy2,fz2,rx,ry,rz,N_molecular,L) private(i, j, xmin, ymin, zmin,rmin2, f)
{
    #pragma omp for// reduction(+:fx2,fy2,fz2)
    /*calculate all pair forces acting on each particles again*/
    for(i = 0; i < N_molecular-1; i++){
        for(j = i+1; j < N_molecular; j++){
            xmin = rx[i] - rx[j] - L*round ((rx[i] - rx[j])/L);
            ymin = ry[i] - ry[j] - L*round ((ry[i] - ry[j])/L);
            zmin = rz[i] - rz[j] - L*round ((rz[i] - rz[j])/L);
            rmin2 = xmin*xmin + ymin*ymin + zmin*zmin;
            if(rmin2 < rcut*rcut)
            {
                f = 48./pow(rmin2,7) - 24./pow(rmin2,4);
                //#pragma omp atomic update
                fx2[i] += f*xmin;
                //#pragma omp atomic update
                fy2[i] += f*ymin;
                //#pragma omp atomic update
                fz2[i] += f*zmin;
                //#pragma omp atomic update
                fx2[j] = fx2[j] - f*xmin;
                //#pragma omp atomic update
                fy2[j] = fy2[j] - f*ymin;
                //#pragma omp atomic update
                fz2[j] = fz2[j] - f*zmin;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

并行化此代码的棘手部分是确保强制数组的更新不会产生竞争条件。这里,当使用i索引完成时,不会发生任何问题,因为不同的线程将处理不同的i索引。但是,j索引不是这样,这足以阻止您使用此方法。

解决方案是将您的力存储在一些本地每线程数组中,并在退出并行区域时将最终单个结果累积到全局数组中。存在其他可能性,我在this answer to a question very similar to yours中描述了(我希望)细节。