我有一个fortran90 代码,它使用化学物种特性(即分子量、粘度等)进行计算。
为了轻松地交换化学物质组,我们保留将所有相关数据存储在一维数组中的模块文件。即我们有 4 个物种,粘度数组有 4 个元素长,每个物种一个条目,依此类推。
需要这些数据的相关子程序可以在use
这个模块中,化学数据根据需要提供。
我们已经使用 openMP 4.5 将大部分代码移植到 GPU 卸载,并在移植这些化学计算时进行。
我想做的只是将整个模块放在 GPU 上,以便use
这些模块变量的任何子例程都可以在目标设备上访问它们。
我最初的想法是!$omp declare target
像我们做函数或其他子例程一样只使用模块,但这似乎并没有被编译器接受。
我真的必须!$omp declare target(variable_x, y,z,a,b,c......)
为整个模块吗?
如果我这样做,那么这些变量的范围是什么?即使子例程没有use
模块,它们现在是否可以访问设备上的所有内容?或者编译器是否足够聪明,可以将它们保持在使用它们的子例程的模块范围内?
use
最后,当我只是在子例程中创建目标区域时,是否需要对作为这些模块的子例程执行任何特殊操作?例如:
subroutine test
use chem_module
implicit none
integer :: i
!$omp parallel do
do i=1,100
*do some calcs with module data
*do I need to tell the compiler about the chem_module module?
end do
!$omp end parallel do
end subroutine
谢谢参观!