声明所有 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
所以,是的,据我所知,您需要大量清单。
我有一个 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
所以,是的,据我所知,您需要大量清单。