我有一个带有以下声明的.h文件:
class Foo{
public:
inline int getInt();
};
我的.cu文件定义了以下内容:
__device__ int Foo::getInt(){
return 42;
}
这非常棒,因为我实际上无法从主机调用getInt
,我可以在.cpp文件中包含.h文件,因此我可以为主机显示类型声明。但对我来说它似乎不应该工作,那么为什么我不需要将__device__
属性放在.h文件中?
答案 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
。