2015-08-14 59 views
1

我正尝试在我的设备中创建Color对象。这里是什么,我有一个简化版:如何在cpp和cuda模块中使用cuda类头文件

Color.hpp

class Color { 
public: 
    Color(){} 
    float r, g, b; 
    // other functions 
} 

test.cu

__global__ void runCuda(){ 
    Color c = Color(); 
} 

int main() { 
    runCuda<<<1,1>>>() 
} 

这给了我一个错误说

calling a host function from a global function is not allowed

所以这很好。我只需要在Color(){}函数前添加__host__和__device__。

但后来我得到以下错误:

host does not name a type

所以从我个人理解,这种情况正在发生,因为我不跟NVCC编译它。问题是我正在使用CMake来构建我的项目。我不太清楚它是如何做的,但它似乎是用C++编译器编译.cpp文件,用nvcc编译器编译.cu。

但在我的设备中,我想创建Color对象。有没有办法解决这个或者在我的CMakefiles或我的代码?或者我需要为我所有的现有类创建一个cuda版本?

回答

5

像这样的东西应该工作:

#ifdef __CUDACC__ 
#define CUDA_HOSTDEV __host__ __device__ 
#else 
#define CUDA_HOSTDEV 
#endif 

class Color { 
public: 
    CUDA_HOSTDEV Color(){} 
    float r, g, b; 
    // other functions 
}; 

当您的HPP文件包含在一个.CU文件时,__CUDACC__macro将被定义。当它被包含在一个.cpp文件中时(该命令将nvcc移交给主编译器),宏将不会被定义。

+0

我简单地复制了你所拥有的,并且C++编译器像预期的那样工作,但是nvcc编译器给了我同样的错误。 – MoneyBall

+0

我有一些我现在纠正的错别字。 –

+0

这也适用于Color类中的函数吗? – MoneyBall