我已经到处寻找有关如何在 CUDA 中准确使用类的一些见解,虽然人们普遍认为它可以完成并且显然是由人们完成的,但我很难找到如何实际做到这一点。
我有一个类,它使用运算符重载等实现基本位集。我需要能够在主机和设备上实例化此类的对象,在两者之间进行复制等。我是否在 .cu 中定义了此类?如果是这样,我如何在我的主机端 C++ 代码中使用它?类的函数不需要像threadId那样访问特殊的CUDA变量;它只需要能够在主机和设备端使用即可。
感谢您的帮助,如果我以完全错误的方式处理此问题,我很想听听替代方案。
最佳答案
在您#include 的 header 中定义类,就像在 C++ 中一样。
任何必须从设备代码调用的方法都应该使用 __device__
和 __host__
declspecs 定义,如果您打算使用 new,则包括构造函数和析构函数
/delete
在设备上(注意 new
/delete
需要 CUDA 4.0 和计算能力 2.0 或更高的 GPU)。
你可能想定义一个像
这样的宏#ifdef __CUDACC__
#define CUDA_CALLABLE_MEMBER __host__ __device__
#else
#define CUDA_CALLABLE_MEMBER
#endif
然后在你的成员函数上使用这个宏
class Foo {
public:
CUDA_CALLABLE_MEMBER Foo() {}
CUDA_CALLABLE_MEMBER ~Foo() {}
CUDA_CALLABLE_MEMBER void aMethod() {}
};
原因是只有 CUDA 编译器知道 __device__
和 __host__
-- 你的宿主 C++ 编译器会报错。
编辑:
备注 __CUDACC__
is defined by NVCC when it is compiling CUDA files .这可以在使用 NVCC 编译 .cu 文件时,或者在使用命令行选项 -x cu
编译任何文件时出现。
关于c++ - CUDA 和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6978643/