声明所有 Fortran 模块变量以 OpenMP 4.5+ 为目标

Declare all Fortran module variables target OpenMP 4.5+

我有一个 fortran90 代码,它使用化学物质属性(即分子量、粘度等)进行计算。

为了轻松地换入和换出化学物质组,我们保留了将所有相关数据存储在一维数组中的模块文件。 IE。我们有 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

所以,是的,据我所知,您需要大量清单。