0

私は現在、ほとんどのルーチンを PGI (15.10) コンパイラで OpenACC を使用して GPGPU に移植することにより、スペクトル要素流体ソルバーを高速化しようとしています。ソースコードは OO-Fortran で書かれています。このソフトウェアには、他の関数やサブルーチンを呼び出すサブルーチンの「層」があります。openacc を使用してコードを GPU に移行するために、移植が必要な各ルーチンに「$acc ルーチン」ディレクティブを配置することを最初に試みました。コンパイル中に「pgf90 -acc -Minfo=accel」を使用すると、次のエラーが表示されます。

nvvmCompileProgram エラー: 9.

エラー: /tmp/pgacc2lMnIf9lMqx8.gpu (146, 24): 関数 'innerroutine_' への無効な前方参照を間違った型で解析します!

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 が有効なルーチンをサポートしていますか?

もしそうなら、私は何を間違っていますか?

4

1 に答える 1