【问题标题】:CUDA and ClassesCUDA 和类
【发布时间】:2011-10-22 03:51:27
【问题描述】:

我已经到处寻找有关如何在 CUDA 中准确使用类的一些见解,虽然人们普遍认为它可以完成并且显然是由人们完成的,但我很难找到如何实际做到这一点。

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

感谢您的帮助,如果我以完全错误的方式处理此问题,我很乐意听到替代方案。

【问题讨论】:

    标签: c++ class cuda


    【解决方案1】:

    在您#include 的标头中定义类,就像在 C++ 中一样。

    任何必须从设备代码调用的方法都应使用__device____host__ declspecs 定义,如果您计划在设备上使用new/delete,则包括构造函数和析构函数(注意@987654326 @/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 编译任何文件时出现。

    【讨论】:

    • 啊 - 所以当它从 cpp 中包含时,它会在没有 device 说明符的情况下进行编译,而当它从 .cu 中包含时,会使用。我想我的第一个担心是这会在从主机传递到设备时导致某种差异,但我现在知道它是如何工作的。非常感谢!
    • 只是在马克的回答中添加一个小警告,这让很多人感到震惊 - CUDA 不支持外部链接,因此编译时必须在编译单元范围内完全定义类及其所有方法GPU 的类。
    • 谢谢@talonmies,这是正确的。设备代码链接器是未来的一项功能。
    • 哇,没想到会在这里找到@harrism,我在cuda网站上看到了你的照片,没想到你会回答简单的问题。
    • 对于@talonmies 的评论,请注意 CUDA 5(现在为预览版)添加了设备代码的链接。
    【解决方案2】:

    这个问题的另一个很好的资源是 CUDA 工具包附带的一些代码示例。在这些代码示例中,您可以找到几乎任何您能想象到的示例。与您的问题相关的是 quadtree.cu 文件。祝你好运。

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多