为什么在没有CUDA __device__属性的情况下定义类标题有效? (C ++)

时间:2011-11-04 16:10:44

标签: c++ oop class header cuda

我有一个带有以下声明的.h文件:

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

我的.cu文件定义了以下内容:

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

这非常棒,因为我实际上无法从主机调用getInt,我可以在.cpp文件中包含.h文件,因此我可以为主机显示类型声明。但对我来说它似乎不应该工作,那么为什么我不需要将__device__属性放在.h文件中?

2 个答案:

答案 0 :(得分:3)

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

但是,如果您希望该类对于主机(和非cuda编译器)可见,但您在主机上具有一些您不需要的__device__功能,则可以始终封装这些功能使用#ifdef __CUDACC__ - #endif。使用nvcc进行编译时预定义__CUDACC__,否则不是。{1}}。所以你可以在标题中写下:

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

答案 1 :(得分:0)

将其更改为以下内容:

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

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