我最近安装了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:in function main':monte_carlo.cpp :( . text 0xa0) :undefined reference tofloat thrust :: detail :: backend :: cuda :: reduce_n,float,thrust :: use_default>,long,float,thrust :: plus(thrust :: transform_iterator,float,thrust :: use_default>,long, float,thrust :: plus)'
但是,如果我改用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/
没有错误 .
我的平台是Ubuntu 10.04和g 4.4.3 .
希望有人能帮助我,谢谢!
Edit OMP问题通过改变@Robrt指出的 -fopenmp
的顺序来解决,但是我无法使用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参考tofloat thrust :: detail :: backend :: cuda :: reduce_n,float,thrust :: use_default>,long,float,thrust :: plus>(thrust :: 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/
1 回答
OpenMP编译似乎是由错误指定的编译参数引起的 . 使用编译
(即在任何预处理器指令之前指定OpenMP代码生成)允许使用支持的推力OpenMP进行正确编译 .
报告的TBB后端编译错误似乎是由于试图在没有TBB支持的推力1.5.3上使用TBB后端引起的 .
[这个答案已经从问题编辑和评论中汇总,以便从CUDA标签的未答复列表中获取问题]