c++ - CUDA 和类

标签 c++ class cuda

我已经到处寻找有关如何在 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/

相关文章:

c++ - 将局部变量声明为右值引用是否无用,例如T&& r = move (v)?

c++ - 无法访问公共(public)静态方法

c++ - OpenCV CUDA 运行速度比 OpenCV CPU 慢

c++ - 如何让cmake找到CUDA

c++ - 知道用户是否选择了子菜单项 MFC

c++ - 在 Visual Studio 的 C++ 项目中是否可以使用宏来识别当前的 SOLUTION 配置?

java - 将类存储在 Map 中以便可以实例化它们

cuda - GPU 上的比较和分支有多慢

c++ - 类中静态成员的地址

c++ - 类内结构内的 vector