我可以使变量在多个函数调用中持久存在,但对于openMP fortran中的每个线程而言都是局部的吗?

时间:2019-06-28 09:36:18

标签: fortran openmp intel-fortran

在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”变量现在在线程之间共享,这违背了目的。

是否有任何简单的方法可以使这两个变量在每个线程中都是局部的,但在函数调用之间仍然存在?

我知道还有其他方法可以解决此问题(过去我曾以相当混乱的方式完成过此工作),因此,如果我要问的不是直接可行的,什么是最好的解决方法问题周围?我应该只将“保存的”值作为函数的参数输入吗?

0 个答案:

没有答案