一个Fortran OpenACC例程如何调用另一个Fortran OpenACC例程?

一个Fortran OpenACC例程如何调用另一个Fortran OpenACC例程?,fortran,gpgpu,openacc,pgi,pgi-accelerator,Fortran,Gpgpu,Openacc,Pgi,Pgi Accelerator,我目前正试图通过使用OpenACC和PGI(15.10)编译器将大多数例程移植到GPGPU,来加速光谱元素流体解算器。源代码是用OO Fortran编写的。该软件具有调用其他函数和子例程的子例程的“层”。为了使用openacc将代码带到GPU,我首先尝试在需要移植的每个例程中放置“$acc例程”指令。在编译过程中,使用“pgf90-acc-Minfo=accel”,我收到以下错误: nvvmCompileProgram错误:9 错误:/tmp/pgacc2lMnIf9lMqx8.gpu(146,

我目前正试图通过使用OpenACC和PGI(15.10)编译器将大多数例程移植到GPGPU,来加速光谱元素流体解算器。源代码是用OO Fortran编写的。该软件具有调用其他函数和子例程的子例程的“层”。为了使用openacc将代码带到GPU,我首先尝试在需要移植的每个例程中放置“$acc例程”指令。在编译过程中,使用“pgf90-acc-Minfo=accel”,我收到以下错误:

nvvmCompileProgram错误:9

错误:/tmp/pgacc2lMnIf9lMqx8.gpu(146,24):解析对类型错误的函数“innerroutine_2;”的无效正向引用

PGF90-S-0155-编译器无法转换加速器区域(请参阅-Minfo消息):设备编译器已退出,状态代码为错误(Test.f90:1)

同样的问题也可以通过以下简单的fortran程序重现:

PROGRAM Test
IMPLICIT NONE

CONTAINS

 SUBROUTINE OuterRoutine( sol, xF, N )
 !$acc routine
   IMPLICIT NONE
   INTEGER :: N
   REAL(KIND=8) :: sol(0:N,1:3)
   REAL(KIND=8) :: xF(0:N,1:3)
   ! LOCAL
   INTEGER :: i

      DO i = 0, N
         xF(i,1:3) = InnerRoutine( sol(i,1:3) )
      ENDDO

 END SUBROUTINE OuterRoutine
 FUNCTION InnerRoutine( sol ) RESULT( xF )
 !$acc routine
   IMPLICIT NONE
   REAL(KIND=8) :: sol(1:3)
   REAL(KIND=8) :: xF(1:3)

      xF(1) = sol(1)*sol(2)
      xF(2) = sol(1)*sol(3)
      xF(3) = sol(1)*sol(1)

 END FUNCTION InnerRoutine

END PROGRAM Test
同样,使用“pgf90-acc-Minfo=accel”编译上述程序会产生问题

openacc是否支持调用其他acc启用例程的acc启用例程

如果是,我做错了什么?

您正确使用了OpenACC“例程”指令。这里的问题是,我们(PGI)还不支持对数组值函数使用“例程”。问题是这种支持需要编译器创建一个临时数组来保存返回值。这意味着每个线程都需要分配这个临时数组,从而导致严重的性能损失。更糟糕的是,如果是帮派或工作人员级别的例程,如何处理共享临时数组

我们确实有对该功能的公开请求,但我们可能需要一段时间才能解决它。同时,您可以尝试内联例程吗?i、 e.使用“-Minline”编译。

您正确使用了OpenACC“例程”指令。这里的问题是,我们(PGI)还不支持对数组值函数使用“例程”。问题是这种支持需要编译器创建一个临时数组来保存返回值。这意味着每个线程都需要分配这个临时数组,从而导致严重的性能损失。更糟糕的是,如果是帮派或工作人员级别的例程,如何处理共享临时数组


我们确实有对该功能的公开请求,但我们可能需要一段时间才能解决它。同时,您可以尝试内联例程吗?i、 e.用“-Minline”编译。

谢谢。添加内联标志后,编译在测试代码上没有问题,并且似乎在我一直在处理的原始代码上解决了这个问题。请注意,不鼓励在问答中留下问候语。你的名字已经在帖子下面了。正常情况下,我也会删除它们。好的,警官。您的声明为该线程添加了非常需要的详细信息。这个也是。谢谢你。添加内联标志后,编译在测试代码上没有问题,并且似乎在我一直在处理的原始代码上解决了这个问题。请注意,不鼓励在问答中留下问候语。你的名字已经在帖子下面了。正常情况下,我也会删除它们。好的,警官。您的声明为该线程添加了非常需要的详细信息。这个也是。