Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何声明OpenMP专用公共块变量?_Fortran_Global Variables_Openmp_Fortran Common Block - Fatal编程技术网

Fortran 如何声明OpenMP专用公共块变量?

Fortran 如何声明OpenMP专用公共块变量?,fortran,global-variables,openmp,fortran-common-block,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 prog

我是并行计算新手,我一直在尝试使用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并行执行,但我对变量“y”有问题,该变量被声明为全局变量并在函数“test”中使用,但它在每个线程中都发生了更改。如果不将“y”声明为函数“test”的参数,如何并行化这样的代码

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

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


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

欢迎,您的标题应该描述您的问题,而不仅仅是重复标签。Threadprivate可能是一种方式。看,这条路是私人的。但首先停止使用公共块,在大约25年的时间里,没有人应该在新代码中使用它们,全局变量就是不会与线程程序混合