我是否可以使一个变量在多个函数调用中持久化,但对openMP fortran中的每个线程都是本地的?
在Fortran中使用openMP,是否有任何方法可以创建每个线程的本地变量,但在函数调用之间保存?基本上类似于每个线程的本地“save”变量 例如,我正试图用以下代码实现生成统一随机数(我知道在openMP并行区域中不调用该代码时,该代码非常有效): 但是,问题是,当从并行区域内调用此函数时,两个“save”变量现在在线程之间共享,这与此目的背道而驰 有没有简单的方法使这两个变量对每个线程都是局部的,但在函数调用之间仍然保持不变我是否可以使一个变量在多个函数调用中持久化,但对openMP fortran中的每个线程都是本地的?,fortran,openmp,intel-fortran,Fortran,Openmp,Intel Fortran,在Fortran中使用openMP,是否有任何方法可以创建每个线程的本地变量,但在函数调用之间保存?基本上类似于每个线程的本地“save”变量 例如,我正试图用以下代码实现生成统一随机数(我知道在openMP并行区域中不调用该代码时,该代码非常有效): 但是,问题是,当从并行区域内调用此函数时,两个“save”变量现在在线程之间共享,这与此目的背道而驰 有没有简单的方法使这两个变量对每个线程都是局部的,但在函数调用之间仍然保持不变 我知道还有其他方法可以解决这个问题(我在过去做过相当混乱的事情)
我知道还有其他方法可以解决这个问题(我在过去做过相当混乱的事情),所以如果我的问题不可能直接解决,那么最好的解决方法是什么?我是否应该将“保存的”值作为参数输入到函数中?就我个人而言,我会避免在并行程序中使用这种不纯的函数,因为这往往会导致您当前面临的问题。但我很想看看是否有人能给你提供比你更好的答案如果你想达到目的,我不会从这里开始…为所有保存的变量添加$omp threadprivate一种方法是声明一个用OpenMP
线程id
索引的种子
数组。长度应为OpenMP线程的最大数量。当从代码的串行部分调用时,例如可以使用索引1。@FrancoisJacq在定义并行区域时是这样做的吗?我的印象是,函数中的局部变量是无法处理的。你可以在任何地方对任何保存的变量进行处理。就我个人而言,我会避免在并行程序中使用这种不纯函数,这往往会导致你目前面临的问题。但我很想看看是否有人能给你提供比你更好的答案如果你想达到目的,我不会从这里开始…为所有保存的变量添加$omp threadprivate一种方法是声明一个用OpenMP线程id
索引的种子
数组。长度应为OpenMP线程的最大数量。当从代码的串行部分调用时,例如可以使用索引1。@FrancoisJacq在定义并行区域时是这样做的吗?我的印象是,不能对函数中的局部变量执行此操作。可以对任何保存的变量执行此操作
function rand_norm(seed)
implicit none
integer*8, intent(inout) :: seed
real*8 :: rand_norm
real*8 :: u, v
real*8, save :: second_rand
integer, save :: avail_flag = 0
if (avail_flag.eq.1) then
rand_norm = second_rand
avail_flag = 0
return
end if
avail_flag = 1
u = rand_float(seed)
v = rand_float(seed)
second_rand = sqrt(-2.D0*log(u))*cos(2.D0*PI*v)
rand_norm = sqrt(-2.D0*log(u))*sin(2.D0*PI*v)
end function