我有一个包含以下声明的 .h 文件:
class Foo{
public:
inline int getInt();
};
我的 .cu 文件定义了以下内容:
__device__ int Foo::getInt(){
return 42;
}
这非常棒,因为虽然我实际上无法从主机调用 getInt
,但我可以将 .h 文件包含在 .cpp 文件中,这样我就可以看到主机的类型声明。但对我来说它似乎不应该工作,那么为什么我不需要将 __device__
属性放在 .h 文件上?
最佳答案
如果它有效,它不应该。它可能是 CUDA 编译器中的错误,将来可能会得到修复 - 所以不要依赖它。
但是,如果您希望该类对主机(和非 cuda 编译器)可见,但您有一些主机上不需要的 __device__
功能,您总是可以使用 #ifdef __CUDACC__
-- #endif
封装这些函数。 __CUDACC__
在使用 nvcc 编译时是预定义的,否则不是。所以你可以在你的标题中写下这样的东西:
class Foo{
public:
#ifdef __CUDACC__
inline __device__ int getInt();
#endif
};
如果你害怕预处理器ifdef太多,你也可以做一个trick如下:
#ifdef __CUDACC__
#define HOST __host__
#define DEVICE __device__
#else
#define HOST
#define DEVICE
#endif
...
class Foo{
public:
inline HOST DEVICE int getInt();
};
关于c++ - 为什么在没有 CUDA __device__ 属性的情况下定义类头有效? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012304/