【问题标题】:Declaring CPP objects inside cuda kernel在 cuda 内核中声明 CPP 对象
【发布时间】:2014-01-08 14:36:20
【问题描述】:

我是 Cuda 新手,在通过 Cuda 运行我的 C++ 项目之前,我需要知道它的限制。 假设我有一个名为 MyClass 的 C++ 类。知道 Cuda 使用 C99,是否可以在内核中声明 MyClass 类型的对象? 下面的代码 sn-p 是否合适?

_global__ void SolveBlaBlaBLa(int x, ...)
{

MyClass obj1;
.
.
.
}

提前致谢, - 鲁鲁

【问题讨论】:

  • CUDA 不使用 C99 作为基础,它遵循 C90,在其中添加了大量 C++98 语言特性。
  • 如果MyClass 有一个__host__-only 构造函数和析构函数,你的代码将是非法的。您需要确保它们使用__device____host__ __device__ 进行注释。
  • @JaredHoberock 感谢您的回复。在这种情况下,我将不得不处理构造函数和析构函数以包含关键字_____device_____ ...这不会是一个问题,我希望...谢谢大家。 _device

标签: c++ c oop cuda


【解决方案1】:

只需提供一个答案即可将其从未答复列表中删除。我认为@JaredHoberock 不会介意。

通常,CUDA 支持大部分 C++ 功能,包括支持设备代码中的对象。

但是,

任何在设备上执行的代码都必须经过适当的修饰。对于普通的单个函数(不是内核),编译器识别以创建代码的设备可调用版本的decorator__device__。这适用于可以在设备上使用的任何对象方法,包括构造函数和析构函数。

您可能还希望熟悉设备代码中使用的 C++ 类的其他限制,例如 documented in the programming guide

【讨论】:

  • 感谢您的回答,@RobertCrovella。我不明白在设备内部装饰物体的原因!编译器处理这个不是更好吗?因为该对象已经在设备内部或外部声明。我可以处理所有限制,以便对象在 CPU 和 GPU 上都能很好地编译。
  • 装饰是在类定义点完成的。不是在实例化对象时。实例化对象不需要额外的装饰。如果您注意该限制(在类定义点装饰方法),那么无论是在主机代码还是设备代码中实例化,它都应该可以正常工作。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多