CUDA和课程

sec*_*ayt 37 c++ cuda class

我一直在搜索有关如何使用CUDA的类的一些见解,虽然人们普遍认为它可以完成并且显然是由人完成,但我很难找到实际的方法.做到这一点.

我有一个类,它通过运算符重载等实现基本的bitset.我需要能够在主机和设备上实例化此类的对象,在两者之间进行复制等.我是否在.cu中定义了这个类?如果是这样,我如何在我的主机端C++代码中使用它?该类的函数不需要访问特殊的CUDA变量,如threadId; 它只需要能够用于主机和设备端.

感谢您的帮助,如果我以完全错误的方式接近这一点,我很想听听替代方案.

har*_*ism 54

在#include的头文件中定义类,就像在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 
Run Code Online (Sandbox Code Playgroud)

然后在您的成员函数上使用此宏

class Foo {
public:
    CUDA_CALLABLE_MEMBER Foo() {}
    CUDA_CALLABLE_MEMBER ~Foo() {}
    CUDA_CALLABLE_MEMBER void aMethod() {}
};
Run Code Online (Sandbox Code Playgroud)

原因是只有CUDA编译器知道__device__并且__host__- 您的主机C++编译器会引发错误.

编辑:注意__CUDACC__由NVCC在编译CUDA文件时定义.这可以在使用NVCC编译.cu文件时,也可以在使用命令行选项编译任何文件时使用-x cu.

  • 只是为Mark的答案添加一个小警告,捕获了很多人--CUDA不支持外部链接,因此在编译GPU类时,必须在编译单元范围内完全定义类及其所有方法. (15认同)
  • 要@talonmies的评论,请注意CUDA 5(现在在预览中)添加了设备代码的链接. (5认同)
  • 哇,我没想到会在这里找到@harrism,我在cuda网站上看到你的照片,我没想到你回答简单的问题. (2认同)