我正在尝试在我的设备中创建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版本?
答案 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移交给主机编译器)时,将不会定义宏。