CUDAのカーネル関数の引数はどこに積まれるか?

目次

何の話か

関数呼び出しは引数をスタックに積んで行われることが多いかと思いますが、CUDAのカーネル関数の場合はどうなの?という話です。
ドキュメントの何処かに書いてあるのかもしれませんが、仮説があれば文献を当たるより実験したほうが速いので実験してみましたという話です。
仮説というのは「カーネル関数の引数はConstantメモリに積まれる」です。

実験

このコードでptxasのverboseを見てみます。

コンパイルはこのコマンド。

nvcc main.cu -ptx --ptxas-options=-v

で、出力されたptxasのverboseを見やすくしたものがこちら。

intの引数が一つ増えるに連れ、cmemの使用量が4Byteづつ大きくなっていることが確認できます。
intdoubleに変えると8Byteづつ大きくなります。
仮説は正しいということですね。

ちなみにPTXではld.param.u32でロードされます。
これはメモリアクセスではありますが、GlobalメモリやSharedメモリへ対する命令ではないので、やはりConstantメモリな気がしますね。

Constantメモリは同一アドレスに複数スレッドがアクセスした際にブロードキャストができるので、このような引数に対しては最適な置き場とも言えそうです。
少なくとも貴重なレジスタを消費する形ではなかったのは良かったです。

おわりに

きっとCUDAのDocumentationに書かれているのでしょうねー

カテゴリー:CUDA
記事作成日:2021-07-21