CUDA device関数を別コンパイル単位に書く (ptxas fatal : Unresolved extern function)
消えたCUDA関連の旧ブログ記事を復元するひとり Advent Calendar 2024の記事です。
__global__関数と__device__関数を別ファイルに書くなどした場合に ptxas fatal : Unresolved extern function というエラーが起きることがある.
原因
__device__関数は基本的には__global__関数にインライン展開される.
なので別ファイルなどコンパイル単位が異なる場合はインライン展開できず、このようなエラーが出る.
解決法
少なくとも2通りある.
nvccのコンパイルオプションで解決する方法
$ nvcc --device-c ...
や
$ nvcc -dc ...
でコンパイルすることでリンクできる.(関数はインライン展開されない)
__device__関数を__global__関数と同じ翻訳単位に書く方法
同じファイルやincludeするヘッダファイルに書いておけばいい. インライン展開される.
おまけ
(最近の)__device__関数は再起呼び出しが可能である.
階乗計算関数など簡単な再帰関数ではPTXの段階で再起が削除されループとなるみたい.