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

で一応通る。書いたプログラムでは一応正常に動作した。
一度にコンパイルしてるから、ラッパー関数を書いても、多分自動的にインライン展開してくれてるかな…いやどうかな…


使ったソースを載せるべきか迷ったけれど、恥ずかしいので載せない。