如何在cpp和cuda模块中使用cuda类头文件

时间:2015-08-14 16:38:08

标签: c++ cuda

我正在尝试在我的设备中创建Color对象。这是我所拥有的简化版本:

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>>>()
}

这给我一个错误说

  

不允许从全局函数调用主机函数

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

但后来我收到以下错误:

  

主机未命名类型

所以根据我的理解,这种情况正在发生,因为我没有用nvcc编译它。问题是我正在使用CMake来构建我的项目。我不太清楚它是如何做到的,但它似乎是用c ++编译器和.cu用nvcc编译器编译.cpp文件。

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

1 个答案:

答案 0 :(得分:6)

这样的事情应该有效:

#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移交给主机编译器)时,将不会定义宏。