在 Fortran 90 中使用 OpenMP 并行化成对引力计算

Parallelizing pairwise gravitational force calculation with OpenMP in Fortran 90

我正在尝试使用 OpenMP 在我的程序中并行计算重力。距离(R 和 R2)的计算没有问题,但 forces/accelerations (A) 出现错误。我知道这与求和中的竞争条件有关。我对原子结构和关键结构进行了一些试验,但找不到解决方案。另外,我不确定哪些变量应该是私有的以及为什么。

是否有使用 OpenMP 经验丰富的人对如何在以下代码示例中更正此问题提出建议?

A = 0.0
!$omp parallel do
do i = 1, Nobj
    do j = i + 1, Nobj
        R2(i,j) = (X(j,1) - X(i,1))**2 &
                + (X(j,2) - X(i,2))**2 &
                + (X(j,3) - X(i,3))**2
        R(i,j) = sqrt(R2(i,j))
        do k = 1, 3
            A(i,k) = A(i,k) + ((mass_2_acc(i,j) / R2(i,j)) * ((X(j,k) - X(i,k)) / R(i,j)))
            A(j,k) = A(j,k) + ((mass_2_acc(i,j) / R2(i,j)) * ((X(i,k) - X(j,k)) / R(i,j)))
        enddo
    enddo
    A(i,:) = A(i,:) * G / mass_acc(i)
enddo
!$omp end parallel do

您正在修改 A(j,k) - jk 都不是 "local" 线程,因为线程并行索引是 i。我的意思是这些索引范围都不限于特定线程,所有线程都将更新所有 A(j,k) 因此出现竞争条件。

您可以做的事情 - 拆分 RA 计算或 使用对称更新 A.

此外,Fortran 是主要列,您首先遍历外部索引,这对性能不利。