CUDAでboostが使えない
CUDAでboostを使おうとするとコンパイルが通らない
/* Filename: main.cu */ #include <boost/lexical_cast.hpp> int main(){ return 0; }
たったのこれだけのプログラムでも
nvcc main.cu
すると
/opt/local/include/boost/lexical_cast.hpp(352): error: expected an expression 1 error detected in the compilation of "/tmp/tmpxft_0000110d_00000000-4_main.cpp1.ii".
と怒られる。これはMacでの結果だけれど、Ubuntuでも同様。
ところがファイル名をmain.cppにすると、
nvcc main.cpp
うまくコンパイル出来る。どうやら拡張子がcuだとboostが上手くコンパイルできないらしい。うーぬ。
対策を考える。Kernel CodeとHost Codeを分離してコンパイルするとか、boostを使う部分だけ分離してコンパイルするとか。
拡張子cuのソース(kernel.cuとする)にはKernelCodeとHostCodeから呼び出すためのラッパー関数を書く。そして、HostCodeはcppに書く。
コンパイルは
nvcc kernel.cu main.cpp
で一応通る。書いたプログラムでは一応正常に動作した。
一度にコンパイルしてるから、ラッパー関数を書いても、多分自動的にインライン展開してくれてるかな…いやどうかな…
使ったソースを載せるべきか迷ったけれど、恥ずかしいので載せない。