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

标签 c++ oop class header cuda

我有一个包含以下声明的 .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/

相关文章:

java - 所有不可变对象(immutable对象)都可以重用吗?

c++ - C++中的类查找结构数组

python - 在 python 类中导入模块

c++ - 代码中的堆损坏

c++ - std::list::splice, list&& VS list&

oop - 如何拆分大类

python - 类的实例使用哪些资源?

c++ - 随机 std::array

c++ - 列出具有私有(private)成员的类的初始化

c++ - 如何在两个类中双重引用子类和父类