告诉NVCC为NOT预处理主机代码以避免重新定义BOOST_COMPILER(Tell NVCC t

2019-09-19 16:59发布

我有一个.CU文件包含主机和设备代码:

// device code
__global__ void
myKernel() { ... }

// host code
#include <boost/thread/mutex.hpp>

boost::mutex myMutex;

int main() { ... }

正如你看到我做一个包括升压转换器的互斥功能。 当我编译文件,我得到,因为下面的警告的错误:

warning C4005: 'BOOST_COMPILER': Macro-Redefinition c:\boost\include\boost-1_49_0\boost\config\compiler\visualc.hpp

所以,我认为NVCC处理所有两种装置 - 和主机代码的预处理。 我说的对,如果是,我如何才能避免这一点,并通过预处理来CL.EXE(MSVC 2010,Win7的)?

我已经试图把主机代码在一个单独的HPP / CPP文件和包括铜文件这个文件 - 同样的问题。 在主机代码我定义的表面的参考将在设备代码中使用。 所以这是我需要在铜文件和主机代码包括要由设备代码分别知名的原因。

Answer 1:

这是一个已知的限制nvcc (技术上cudafe ,我认为)。 NVCC使用文件扩展名来确定是否给定的源文件应为设备代码被处理或传递给预处理器CUDA然后设备的编译器。 这编译轨迹不能正确地分析了一些提振包含了非常复杂的声明,并编译失败。

解决的办法是无法导入内部升压头.cu文件。 把你的主机增压代码在.cc文件,设备代码和内核在一个单独的启动.cu文件,并做一些瘦包装从访问内核调用.cc文件。 您还可以通过所有的源nvcc进行编译,但是从设备代码中分离升压进口消除了前端窒息升压声明的问题。



文章来源: Tell NVCC to NOT preprocess host code to avoid BOOST_COMPILER redefinition
标签: boost cuda nvcc