Можно ли заставить переменную сохраняться при нескольких вызовах функций, но быть локальной для каждого потока в openMP fortran? - PullRequest
1 голос
/ 28 июня 2019

Используя openMP в Fortran, есть ли способ создать переменную, которая является локальной для каждого потока, но сохраняется между вызовами функций?В основном, как переменная 'save', которая является локальной для каждого потока.

Например, я пытаюсь реализовать преобразование Бокса-Мюллера для генерации однородных случайных чисел со следующим кодом(что, как я знаю, прекрасно работает, когда НЕ вызывается в параллельной области 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' теперь совместно используютсятемы, которая побеждает цель.

Есть ли какой-нибудь простой способ сделать эти две переменные локальными для каждого потока, но все еще сохраняться между вызовами функций?

Я знаю, что есть другие способы решения этой проблемы (которые у меня естьсделано в прошлом довольно грязно), так что, если то, что я спрашиваю, не представляется возможным, каков наилучший способ обойти проблему?Стоит ли просто вводить «сохраненные» значения в качестве аргументов функции?

...