我最近安装了CUDA 5,发现基于Thrust的现有代码无法编译。如果我切换到OMP或TBB,则只会发生错误。
所以我使用Thrust示例中的monte_carlo.cpp进行了实验。
当我使用CUDA 5.0的include路径时,我收到了这个错误:
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&gt ;, long,float,thrust :: plus(thrust :: transform_iterator,float, thrust :: use_default>,long,float,thrust :: plus)'
但如果我使用
更改为CUDA 4.1g ++ -O2 -o monte_carlo monte_carlo.cpp -DTHRUST_DEVICE_SYSTEM = THRUST_DEVICE_SYSTEM_OMP -fopenmp -I /usr/local/cuda-4.1/include /
没有错误。
我的平台是Ubuntu 10.04,带有g ++ 4.4.3。
希望有人能帮助我,谢谢!
修改
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 thrust :: detail :: backend :: cuda :: reduce_n,float,thrust :: use_default>,long,float,thrust :: plus>(推力: :transform_iterator,float,thrust :: use_default>,long,float,thrust :: plus)' 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 /
答案 0 :(得分:1)
OpenMP编译似乎是由错误指定的编译参数引起的。使用
进行编译g++ -O2 -o monte_carlo monte_carlo.cpp -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP -lgomp -I\usr\local\cuda\include
(即在任何预处理器指令之前指定OpenMP代码生成)允许使用支持OpenMP的推力进行正确编译。
报告的TBB后端编译错误似乎是由于试图在没有TBB支持的推力1.5.3上使用TBB后端引起的。
[这个答案已经从问题编辑和评论中汇总,以便将问题从CUDA标签的未答复列表中删除]