声明所有Fortran模块的变量,目标是OpenMP 4.5+。

问题描述 投票:1回答:1

我有一个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 openmp fortran90 offloading
1个回答
0
投票

原来这只是Fortran API的一部分......它需要一个列表,你不能做一个包罗万象的处理。

!$omp declare target

declare stuff...

!$omp end declare target

所以是的,据我所知,你需要一个庞大的名单。

© www.soinside.com 2019 - 2024. All rights reserved.