声明所有Fortran模块变量的目标为OpenMP 4.5+;
我有一个fortran90代码,它使用化学物种属性(即分子量、粘度等)进行计算 为了方便地交换化学物种组,我们保留了模块文件,将所有相关数据存储在一维数组中。也就是说,我们有4个物种,粘度数组有4个元素长,每个物种有一个条目,依此类推 需要该数据的相关子程序可以声明所有Fortran模块变量的目标为OpenMP 4.5+;,fortran,openmp,fortran90,offloading,Fortran,Openmp,Fortran90,Offloading,我有一个fortran90代码,它使用化学物种属性(即分子量、粘度等)进行计算 为了方便地交换化学物种组,我们保留了模块文件,将所有相关数据存储在一维数组中。也就是说,我们有4个物种,粘度数组有4个元素长,每个物种有一个条目,依此类推 需要该数据的相关子程序可以使用该模块,并且可以根据需要提供化学数据 我们已经使用openMP 4.5将大部分代码移植到GPU卸载中,并在移植到这些化学计算上 我想做的是将整个模块放在GPU上,这样使用这些模块变量的任何子例程都可以在目标设备上访问它们 我最初的想法
使用该模块,并且可以根据需要提供化学数据
我们已经使用openMP 4.5将大部分代码移植到GPU卸载中,并在移植到这些化学计算上
我想做的是将整个模块放在GPU上,这样使用这些模块变量的任何子例程都可以在目标设备上访问它们
我最初的想法是,$omp declare target
像我们使用函数或其他子例程一样使用模块,但编译器似乎不接受这一点
我真的必须$omp为整个模块声明目标(变量x、y、z、a、b、c……)
如果我这样做,那么这些变量的范围是什么?即使子例程不使用模块,设备上的所有东西现在都可以访问它们吗?或者编译器是否足够聪明,能够将它们保持在使用它们的子例程的模块范围内
最后,当我在子例程中创建目标区域时,是否需要对使用这些模块的子例程执行任何特殊操作?例如:
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
因此,是的,据我所知,您需要一个庞大的列表。结果表明,这只是Fortran API的一部分。。。它需要一个列表,而你不能做一个包罗万象的工作
!$omp declare target
declare stuff...
!$omp end declare target
是的,据我所知,你需要一份庞大的清单