Fortran/OpenACCのループ内サブルーチンの可変長配列の実体について

目次

なんの話か

Fortran/OpenACCのループ内サブルーチンで可変長配列を用いた場合、実体はどこに保管されるのかというのを調べてみました。
コンパイル時に配列長が決定していないためレジスタに作られることはないだろうとの予想のもと、カーネル内mallocを呼んでいるのかなーと言う気持ちで調べていきます。
このブログ初のFortranについての記事です。

実験コード

調査に用いたコードはこちらです。
inline展開されると困るので、2ファイルに分けて書いています。

(Makefile等はこちら enp1s0/openacc-subroutine - GitHub

2ファイル用意したものの、実際にはsub.f90があれば調査できます。
コンパイルしたsub.o内に含まれるPTXをcuobjdumpで覗きます。

予想通りmallocが呼ばれていることが確認できます。
つまり可変長配列の実体はDeviceメモリ上です。
では、可変長配列をサイズ決め打ちの固定長にするとどうなるかと言うと、

  • サイズが小さいときはレジスタ
  • サイズが多いときは同様にカーネル内malloc

となることが確認できます。

おわり

カーネル内mallocというものを知った時誰が使うのだろうと思っていましたが、OpenACC/Fortranの実装で使われていたのですね。
mallocの挙動についての解析記事は「CUDAのカーネル関数内mallocの挙動について - 天炉48町」。

カテゴリー:CUDA
記事作成日:2021-09-24