最近 CUDA 5 をインストールしましたが、Thrust に基づく既存のコードをコンパイルできないことがわかりました。このエラーは、OMP または TBB に切り替えた場合にのみ発生します。
そこで、Thrust の例の monte_carlo.cpp を使用して実験を行いました。
CUDA 5.0 のインクルード パスを使用すると、次のエラーが発生しました。
g++ -O2 -o monte_carlo monte_carlo.cpp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -fopenmp -I /usr/local/cuda-5.0/include/
/tmp/ccFsJtAs.o: 関数
main': monte_carlo.cpp:(.text+0xa0): undefined reference to
内で float Thrust::detail::backend::cuda::reduce_n、float、thrust::use_default>、long、float、thrust::plus(推力::transform_iterator、フロート、推力::use_default>、ロング、フロート、推力::プラス)'
しかし、使用してCUDA 4.1に変更すると
g++ -O2 -o monte_carlo monte_carlo.cpp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -fopenmp -I /usr/local/cuda-4.1/include/
エラーはありません。
私のプラットフォームは、g++ 4.4.3 を使用した Ubuntu 10.04 です。
誰かが私を助けてくれることを願っています、ありがとう!
Edit
OMPの問題は-fopenmp
、@Robertが指摘したように順序を変更することで解決されますが、TBBを使用してコンパイルに失敗しました
g++ -O2 -o monte_carlo monte_carlo.cpp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_TBB -ltbb -I /usr/local/cuda/include/ /tmp/ccxSmcnJ.o: 関数内
main': monte_carlo.cpp:(.text+0xa0): undefined reference to
float 推力::詳細::バックエンド::cuda::reduce_n,フロート、推力::use_default>、ロング、フロート、推力::プラス >(推力::transform_iterator、フロート、推力::use_default>、ロング、フロート、推力::プラス)' collect2: ld が 1 つの終了ステータスを返しました
しかし、私が使用するとコンパイルは成功します
g++ -O2 -o monte_carlo monte_carlo.cpp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_TBB -ltbb -I /usr/local/cuda-4.1/include/