【发布时间】:2012-11-11 02:52:58
【问题描述】:
我最近安装了 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 tofloat 推力::细节::后端::cuda::reduce_n,浮动, 推力::use_default>, 长, 浮动, 推力::plus(thrust::transform_iterator, 浮点数, 推力::use_default>, 长, 浮动, 推力::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/
没有错误。
我的平台是带有 g++ 4.4.3 的 Ubuntu 10.04。
希望有人能帮助我,谢谢!
编辑
正如@Robert 指出的那样,通过更改-fopenmp 的顺序来解决OMP 问题,但我无法使用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 tofloat 中推力::detail::backend::cuda::reduce_n, 浮动, 推力::use_default>, 长, 浮动, 推力::plus >(推力::transform_iterator,浮动,推力::使用默认值>,长,浮动,推力::加)' 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/
【问题讨论】:
-
在 cuda 4.1 中,您的编译命令对我来说失败了,但如果我使用 here 匹配指令:
g++ -O2 -o monte_carlo monte_carlo.cpp -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP -lgomp -I\usr\local\cuda\include它可以工作。在我的情况下,编译器切换的顺序很重要。在 CUDA 5.0 中,我观察到相同的行为。是否有某种原因你没有完全按照说明中给出的编译器开关的顺序匹配? (你也不包括-lgomp?) -
@RobertCrovella 我添加了 -lgomp 但得到了同样的错误
-
开关的顺序很重要(例如
-fopenmp)。对我有用的顺序与您发布的不同。您发布的内容也与说明不符。 -
试试这个命令:
g++ -O2 -o monte_carlo monte_carlo.cpp -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP -lgomp -I/usr/local/cuda-5.0/include -
感谢@RobertCrovella OMP 现在已编译,但我尝试 TBB 它失败了。我用 g++ -O2 -o monte_carlo monte_carlo.cpp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_TBB -ltbb -I /usr/local/cuda/include/