0

我最近安装了 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浮动推力::细节::后端::cuda::reduce_n,浮动,推力::使用默认>,长,浮动,推力::加

(推力::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。

希望有人能帮助我,谢谢!

编辑 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浮动推力::detail::backend::cuda::reduce_n,浮动, 推力::use_default>, 长, 浮动, 推力::plus >(推力::transform_iterator, 浮动, 推力::use_default>, 长, 浮动, 推力::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/

4

1 回答 1

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 标签的未回答列表中删除]

于 2016-01-16T11:05:46.580 回答