为啥 nvcc 无法使用 boost::spirit 编译 CUDA 文件?

Posted

技术标签:

【中文标题】为啥 nvcc 无法使用 boost::spirit 编译 CUDA 文件?【英文标题】:Why does nvcc fails to compile a CUDA file with boost::spirit?为什么 nvcc 无法使用 boost::spirit 编译 CUDA 文件? 【发布时间】:2011-11-15 15:22:12 【问题描述】:

我正在尝试将 CUDA 集成到使用 boost::spirit 的现有应用程序中。

隔离问题,我发现以下代码无法与 nvcc 一起编译:

main.cu:

#include <boost/spirit/include/qi.hpp>
int main()
    exit(0);

使用nvcc -o cudaTest main.cu 编译我得到很多可以看到here 的错误。

但如果我将文件名更改为main.cpp,并使用nvcc 再次编译,它就可以工作。这里发生了什么,我该如何解决?

【问题讨论】:

如果扩展名不是 .cpp,nvcc 是否假定它是 C 代码,如果可能是 C++? @awoodland:这极不可能,因为错误与模板参数有关。 【参考方案1】:

nvcc 有时无法编译复杂的模板代码,例如在 Boost 中发现的代码,即使该代码仅用于 __host__ 函数。

当文件的扩展名是 .cpp 时,nvcc 不会自行解析,而是将代码转发给主机编译器,这就是为什么您会根据文件扩展名观察到不同的行为。

如果可能,尝试将依赖于 Boost 的代码隔离到不需要由 nvcc 解析的 .cpp 文件中。

我也一定要试试最近的CUDA 4.1 附带的nvccnvcc 的模板支持随着每个版本的发布而改进。

【讨论】:

我通常解决这个问题的方法是将我的控制代码放在一个纯 .cpp 文件中,我用我的标准编译器处理该文件,它调用在 .cu 文件中单独实现的特定函数.效果很好。 我通常像 Kerrek SB 所说的那样隔离 CUDA 代码,但问题是现在我需要使用 .h 文件中的一些类定义,其中包括提升精神,我不知道如何从nvcc 隐藏精神,因为这个类使用它。 Jared Hoberock 我正在使用 CUDA 4.0 编译工具。不知道升级到 4.1 是否会解决它,但当其他一切都不起作用时,我会尝试。 @Vik:您可能会调查是否可以应用 pimpl 模式来解决您的类定义问题:en.wikipedia.org/wiki/Pimpl @JaredHoberock,这个解决方法解决了我的问题,谢谢。但这看起来像一个 nvcc 错误。希望它得到修复以节省其他人的时间。 @masterxilo 尝试使用 Eigen 3.3(当前为 rc1)。它仍然会产生很多警告,但至少它可以编译(至少我测试过的几件事)。请参阅 this 了解我的测试设置。

以上是关于为啥 nvcc 无法使用 boost::spirit 编译 CUDA 文件?的主要内容,如果未能解决你的问题,请参考以下文章

nvcc 警告设备变量是主机变量 - 为啥?

为啥 NVCC 对 constexpr 比非 constexpr 主机函数更严格?

无法使用 nvcc 找到 Torch 头文件

无法使用 sudo 命令编译 cuda

nvcc 致命:无法检测主机编译器属性

NVCC 无法处理 MSVC 编译器选项中的嵌套引号