Einglish page is here.
エラー再現
__global__関数と__device__関数を別ファイルに書くなどしたときに起きる.原因
__device__関数は基本的には__global__関数にインライン展開される.なので別ファイルなどコンパイル単位が異なる場合はインライン展開できず、このようなエラーが出る.
解決法
少なくとも2通りある.nvccのコンパイルオプションで解決する方法
$ nvcc --device-c ...
や
$ nvcc -dc ...
でコンパイルすることでリンクできる.(関数はインライン展開されない)
__device__関数を__global__関数と同じ翻訳単位に書く方法
同じファイルやincludeするヘッダファイルに書いておけばいい. インライン展開される.おまけ
(最近の)__device__関数は再起呼び出しが可能である.階乗計算関数など簡単な再帰関数ではPTXの段階で再起が削除されループとなるみたい.
カテゴリー:CUDA
記事作成日:2018-08-26