在Fortran中使用openMP,有什么方法可以创建每个线程本地但在函数调用之间保存的变量?基本上就像每个线程本地的'save'变量一样。
例如,我正在尝试使用以下代码来实现Box-Muller transform来生成统一的随机数(我知道,当在openMP并行区域中未调用该代码时,该代码非常有效):
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
但是,出现了一个问题,当从并行区域中调用此变量时,两个“ save”变量现在在线程之间共享,这违背了目的。
是否有任何简单的方法可以使这两个变量在每个线程中都是局部的,但在函数调用之间仍然存在?
我知道还有其他方法可以解决此问题(过去我曾以相当混乱的方式完成过此工作),因此,如果我要问的不是直接可行的,什么是最好的解决方法问题周围?我应该只将“保存的”值作为函数的参数输入吗?