在cuda中使用动态分配的C ++类?

时间:2015-11-15 01:49:30

标签: c++ cuda

我对将C ++类移植到CUDA有一个基本的疑问,我无法找到一个直接,明确的答案,看看它到底是什么样的痛苦。

我认为人们会同意主机的C ++代码经常在构造函数和析构函数中使用new / delete运算符。考虑到轻松将C ++代码移植到CUDA,很少有帖子声称它“简单”,或者说更简单,更容易,并且给出的主要原因是__host__ __device__装饰器的示例。在一些帖子中发现设备中的动态分配通常意味着严重的性能损失并不难。那么,CUDA中的C ++类应该怎么做呢?

添加装饰器不会改变构造函数和析构函数核心中发生的内存的动态分配。似乎有人需要在没有new / delete的情况下重写C ++类。根据我的经验,令人印象深刻的是,与静态分配相比,新/删除类的行为有多么糟糕,原因显而易见,但它真的很糟糕,就像去20年代的处理器一样...那么,有什么人拥有用动态分配移植C ++应用程序吗? (对于数组中可以用手计数的超过极少数双数)

1 个答案:

答案 0 :(得分:2)

标准方法是更改​​代码中对象的范围和生命周期,以便不必在设备上作为计算的一部分连续创建和销毁对象。大多数分布式内存架构(CUDA,HPC集群等)中的内存分配都很昂贵,通常的解决方案是尽可能少地使用它,并通过延长对象的生命周期来分摊操作成本。

理想情况下,在编程开始时创建所需的所有对象,即使这意味着预先分配将在程序运行时使用的对象池。这比ad-hoc内存分配和释放更有效。它还避免了内存碎片问题,这可能会成为页面大小相当大的GPU硬件的问题。