CUDAの__device__関数のポインタ

CUDA Advent Calendar 2019 18日目の記事です.

__device__関数のポインタ

CUDAの__device__関数は基本的にはinline展開されるのですが,計算が複雑な再帰関数や関数ポインタを扱う場合はinline展開されず関数が作られcallされます.
このためif分岐を関数ポインタの配列を使って消したりもできそうなのですが,果たしてそれって速いの?というのが今回の記事です.

実験

コードはこんな感じです.
同一warp内で分岐が発生するような__global__関数です. 時間計測はnvprofで行います.
結果がこちら. kernel_ifがif分岐,kernelが関数ポインタ配列による疑似分岐の実行時間ですが,if分岐のほうが速いですね.
関数呼び出しのコストが大きいんですかね.

PTXでは関数呼び出しはどうなっているのか

上のcuコードをPTXにし,関数呼び出しの部分を切り出したのがこちら. それはそう感があって面白みにかけますが,どうやって関数を呼び出しているんでしょうかね?
つまり関数が終わった際にどうやって呼び出し場所まで戻ってくるかなど不思議なところがあります.
PTXを見ると__local_depotなる怪しい記憶領域を取っていたりしているのでこのあたりに帰り番地を記録していたりするのでしょうか?

カテゴリー:CUDA
記事作成日:2019-12-18