使用save openmp线程安全创建Fortran子例程

使用save openmp线程安全创建Fortran子例程,fortran,openmp,Fortran,Openmp,我正在使用netlib LSODAR子例程来集成ODE。其代码为。代码在F77中,使用save语句和数据构造。我不能仅仅删除它们,代码需要很长的时间才能通过并编辑每个代码的备选方案。我的代码需要运行多个集成,因此我希望使用openmp来并行化代码。有没有办法使这些代码线程安全?我已经将所有函数和子例程递归,并将所有输入变量设置为private/firstprivate子例程,但没有任何帮助。感谢您的帮助。如果有任何其他线程安全的替代方案也可以 一个样本是 program main !$omp

我正在使用netlib LSODAR子例程来集成ODE。其代码为。代码在F77中,使用save语句和数据构造。我不能仅仅删除它们,代码需要很长的时间才能通过并编辑每个代码的备选方案。我的代码需要运行多个集成,因此我希望使用openmp来并行化代码。有没有办法使这些代码线程安全?我已经将所有函数和子例程递归,并将所有输入变量设置为private/firstprivate子例程,但没有任何帮助。感谢您的帮助。如果有任何其他线程安全的替代方案也可以

一个样本是

program main
  !$omp parallel
     call counter()
     call counter()
  !$omp end parallel
end program main

subroutine counter()
 integer i
 save i
 i = i+1
end subroutine counter

我不能干预save语句,还有一些常见的块。在我的理想情况下,i应该在每个线程的末尾为2。但是,在这种情况下,它只会导致(处理器数量)*2。

如果没有一个实际的例子来说明您想要实现什么以及并行化应该是什么样子,那么回答这个问题就有点困难

我可以给出一个一般性的提示,看看OpenMP构造来私有化数据。在您的特定情况下,您希望私有化全局数据,因此需要
threadprivate
指令(OpenMP API 5.0规范中的第2.19.2节)和
copyin
/
copyout
指令(第2.19.6节)

编辑: 添加代码exmaple后,您可以通过向代码添加
原子指令来确保代码线程安全:

subroutine counter()
 integer i
 save i
!$omp atomic
 i = i+1
!$omp end atomic
end subroutine counter
这将确保所有线程在没有争用条件的情况下更新变量的单个副本

如果希望通过线程获得变量的一个副本,则必须执行以下操作:

subroutine counter()
 integer i
 save i
!$omp threadprivate(i)
 i = i+1
end subroutine counter

然后,您可以使用
copyin
copyout
将值移动到
i

的线程私有副本中。您可以给出示例代码吗?