为什么没有CUDA __device__属性定义类头工作?(c++)

Why defining class headers without CUDA __device__ attribute works? (C++)

本文关键字:工作 c++ 定义 CUDA device 属性 为什么      更新时间:2023-10-16

我有一个.h文件,声明如下:

class Foo{
public:
    inline int getInt();
};

和我的.cu文件定义如下:

__device__ int Foo::getInt(){
   return 42;
}

这非常棒,因为尽管我不能从host调用getInt,但我可以在。cpp文件中包含。h文件,这样我就可以在主机上看到类型声明。但对我来说,它似乎不应该工作,所以为什么我不需要把__device__属性放在。h文件?

如果它工作,它不应该。这可能是CUDA编译器中的一个错误,将来可能会修复-所以不要依赖它。

然而,如果你想让类对主机(和非cuda编译器)可见,但是你有一些__device__功能,你不需要在主机上,你可以总是用#ifdef __CUDACC__#endif封装这些功能。__CUDACC__是在使用nvcc编译时预定义的,否则不是。所以你可以在标题中写这样的内容:

class Foo{
public:
#ifdef __CUDACC__
    inline __device__ int getInt();
#endif
};

如果你害怕有太多的预处理器ifdef,你也可以做如下的技巧:

#ifdef __CUDACC__
#define HOST __host__
#define DEVICE __device__
#else
#define HOST
#define DEVICE
#endif
...
class Foo{
public:
    inline HOST DEVICE int getInt();
};

改成:

__device__ int Foo::getInt(){
   return 42;
}

问题在于函数的返回类型。它不是void,它是int