如何声明OpenMP私有公共块变量?

时间:2016-12-31 15:06:40

标签: fortran global-variables openmp fortran-common-block

我是并行计算的新手,我一直试图使用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,但我对变量有问题" y"它被声明为全局并用于函数" test"但它在每个线程内都有变化。如何在不声明" y"的情况下并行化这样的代码?作为函数的参数" test"?

另外,有没有办法让每个线程都能携带迭代计数器的值" i"私下,整个计划(包括通过职能)?

1 个答案:

答案 0 :(得分:1)

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

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