为啥 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 附带的nvcc
。 nvcc
的模板支持随着每个版本的发布而改进。
【讨论】:
我通常解决这个问题的方法是将我的控制代码放在一个纯.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 文件?的主要内容,如果未能解决你的问题,请参考以下文章