2011-11-15 14 views
2

私はboost :: spiritを使用している既存のアプリケーションにCUDAを統合しようとしています。nvccがboost :: spiritでCUDAファイルをコンパイルできないのはなぜですか?

main.cu

nvcc -o cudaTest main.cuしてコンパイル
#include <boost/spirit/include/qi.hpp> 
int main(){ 
    exit(0); 
} 

私はhereを見ることができ、エラーの多くを得る、問題の切り分け

は、私は次のコードは、NVCCとcopileていないことが判明しました。

ファイル名をmain.cppに変更し、nvccを使用して再度コンパイルすると機能します。ここで何が起こっていて、どうすれば修正できますか?

+0

'nvcc'は、拡張子が.cppではないとすればC言語、それともC++であれば? – Flexo

+0

@awoodland:エラーはテンプレートの引数に関するものなので、これはほとんどありません。 –

答えて

4

nvccは、コードが__host__の関数でのみ使用されている場合でも、Boostにあるような複雑なテンプレートコードをコンパイルするときに時々問題があります。

ファイルの拡張子が.cppの場合、nvccは解析自体を行わず、コードをホストコンパイラに転送します。そのため、ファイル拡張子によって異なる動作が発生します。

可能であれば、ブーストに依存するコードをで解析する必要のないファイル.cppに隔離してください。

CUDA 4.1と一緒に出荷されるnvccも試してみてください。 nvccのテンプレートサポートは、リリースごとに向上します。

+1

私が通常これを解決する方法は、私の標準のコンパイラで処理する純粋な '.cpp'ファイルに私の制御コードを持たせ、' .cu'ファイルに別々に実装された特定の関数を呼び出します。それはかなりうまくいく。 –

+0

私は通常、_Kerrek SB_のようにCUDAコードを分離していますが、問題は、 '.h'ファイルにあるいくつかのクラス定義を使用する必要があり、魔法はブーストスピリットを含み、どのように非表示にするのか分かりませんこのクラスはそれを使用して以来、 'nvcc'の精神を使用しています。 _Jared Hoberock_私はCUDA 4.0コンパイルツールを使用しています。 4.1へのugradingがそれを解決するかどうかはわかりませんが、他のすべてがうまくいけば試してみます。 – Vik

+1

@Vik:クラス定義の問題を回避するためにpimplパターンを適用できるかどうかを調べることができます:http://ja.wikipedia.org/wiki/Pimpl –

関連する問題