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

okxuctiv  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(254)

我试图在我的设备中创建颜色对象。下面是我的简化版本:
在***颜色.hpp***中:

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

在***测试中,cu***:

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

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

这给了我一个错误
不允许从global函数调用host函数
这样就可以了,我只需要在Color(){}函数前面添加__host__和__device__。
但是,我得到了以下错误:

host不命名类型

据我所知,这是因为我没有用nvcc编译它,问题是我用CMake来构建我的项目,我不太清楚它是如何做的,但它似乎是用c++编译器编译.cpp文件,用nvcc编译器编译.cu文件。
但是在我的设备中,我想创建Color对象。有没有办法在我的CMakefile或代码中修复这个问题?或者我需要为我所有现有的类创建一个cuda版本?

lyr7nygr

lyr7nygr1#

类似这样的方法应该可以奏效:

#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__宏将被定义;当它包含在.cpp文件中时(nvcc将其转交给主机编译器),宏将不会被定义。

dgiusagp

dgiusagp2#

您也可以尝试类似下面的方法。

#ifndef __host__
#define __host__
#endif

#ifndef __device__
#define __device__
#endif

使用这种方法,你将不需要修改你的代码。我不确定这是否合适,但它似乎适用于我的项目。你可能应该在包含CUDA头文件 * 之后 * 包含这些定义。

相关问题