【问题标题】:Compile Error Changing Backend System of Thrust with CUDA 5使用 CUDA 5 更改推力后端系统时编译错误
【发布时间】: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/

标签: cuda thrust


【解决方案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 后端引起的。

[此答案已从问题编辑和 cmets 中收集,以便将问题从 CUDA 标签的未回答列表中删除]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多