我有一个fortran90的代码,使用化学物种属性(如分子量、粘度等)进行计算。
为了方便交换化学物种的组别,我们保留了模块文件,将所有相关数据存储在1D数组中。即我们有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
谢谢你来看!
原来这只是Fortran API的一部分......它需要一个列表,你不能做一个包罗万象的处理。
!$omp declare target
declare stuff...
!$omp end declare target
所以是的,据我所知,你需要一个庞大的名单。