cuda中动态分配的C类?

C++ classes with dynamic allocation in cuda?

我对将 C 类移植到 CUDA 有一个基本的疑问,我找不到一个直接、明确的答案来说明这到底是什么痛苦。

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

添加装饰器不会改变发生在构造函数和析构函数核心的内存动态分配。似乎确实需要在没有 new/delete 的情况下重写 C 类。根据我的经验,与静态分配相比,新/删除类的行为有多糟糕,原因很明显,但这真的很糟糕,就像使用 20 年的处理器......那么,拥有移植的 C 应用程序具有动态分配功能吗? (对于一个可以用手数数的数组中的双精度数非常多)


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

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