1

我是并行计算的新手,我一直在尝试使用 OpenMP 并行化我之前研究过的顺序 Fortran 程序,我的主要代码类似于这个例子:

    program main
use omp_lib
implicit none
integer :: i
double precision :: y , test , a(5)
common/y/y
external :: test
a=[1,2,3,4,5]
do i=1,5
    y=a(i)
    print*,test(2.d0)
end do
end program main

double precision function test(x)
   implicit none
   double precision :: y , x
   common/y/y
   test=y*x
   return
end function

我正在尝试使用 !$OMP PARALLEL DO ,但我对声明为全局并在函数“test”中使用的变量“y”有问题,但它在每个线程中都发生了变化。如何在不将“y”声明为函数“test”的参数的情况下并行化这样的代码?

另外,有没有什么方法可以让每个线程在整个程序中(包括通过函数)私下携带迭代计数器“i”的值?

4

1 回答 1

1

OMP 对在 OMP 构造开始之前存在的所有变量使用 DEFAULT() 类型。DEFAULT() 的默认值是共享的。这意味着您的公共块变量默认情况下是共享变量。然而,OMP 构造中的函数使用它们的本地范围来创建函数局部变量的私有版本。您通过 COMMON 块传递给函数的 y 变量不是函数本地的。这意味着它保留了共享类型,并且在所有线程中都是通用的。

如果这只是另一个变量,那么您可以通过在 OMP 构造中将 y 声明为 PRIVATE() 变量来解决此问题。相反,因为这是在 COMMON 块内,所以您需要在每个引用公共块的位置将 y 声明为 THREADPRIVATE。如果您甚至在一个地方错过了它,它将默认成为所有线程中的共享变量。假设它甚至可以编译。

于 2018-05-10T23:38:37.453 回答