【问题标题】:How to declare OpenMP private common block variables?如何声明 OpenMP 私有公共块变量?
【发布时间】:2017-05-15 12:45:53
【问题描述】:

我是并行计算的新手,我一直在尝试使用 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”的值?

【问题讨论】:

  • 欢迎,您的标题应该描述您的问题,而不仅仅是重复标签。
  • Threadprivate 是一种方式。但是首先停止使用公共块,大约 25 年没有人应该在新代码中使用它们,并且全局变量只是不与线程程序混合

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2023-03-27
    • 2013-06-11
    • 2014-09-07
    • 2015-03-27
    • 2018-11-12
    • 1970-01-01
    • 2011-05-25
    • 2011-12-03
    相关资源
    最近更新 更多