Используя 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' теперь совместно используютсятемы, которая побеждает цель.
Есть ли какой-нибудь простой способ сделать эти две переменные локальными для каждого потока, но все еще сохраняться между вызовами функций?
Я знаю, что есть другие способы решения этой проблемы (которые у меня естьсделано в прошлом довольно грязно), так что, если то, что я спрашиваю, не представляется возможным, каков наилучший способ обойти проблему?Стоит ли просто вводить «сохраненные» значения в качестве аргументов функции?