1

我有一个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 

谢谢参观!

4

1 回答 1

0

原来这只是 Fortran API 的一部分......它需要一个列表,你不能做一个包含

!$omp declare target

declare stuff...

!$omp end declare target

所以,是的,据我所知,您需要一份庞大的清单。

于 2020-05-13T12:15:49.147 回答