【发布时间】: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 可能是一种方式。见software.intel.com/en-us/forums/… 和stackoverflow.com/questions/32446564/…
-
Threadprivate 是一种方式。但是首先停止使用公共块,大约 25 年没有人应该在新代码中使用它们,并且全局变量只是不与线程程序混合
标签: fortran global-variables openmp fortran-common-block