在cuda中具有动态分配的C++类
C++ classes with dynamic allocation in cuda?
我对将C++类移植到CUDA有一个基本的怀疑,我找不到一个直接、明确的答案来回答最终的痛苦。
我认为有人会同意,主机的C++代码将经常在构造函数和析构函数中使用新的/delete运算符。考虑到将C++代码轻松移植到CUDA,很少有帖子声称它"很容易",或者说越来越容易,给出的主要原因是__host__
__device__
装饰器的例子。在一些帖子中不难发现,设备中的动态分配通常意味着性能上的严重损失。那么,CUDA中的C++类应该怎么处理呢?
添加decorator不会改变构造函数和析构函数核心的动态内存分配。似乎确实需要在没有new/delete的情况下重写C++类。根据我的经验,与静态分配相比,一个新的/delete类的表现有多糟糕,这真的令人印象深刻,原因很明显,但它真的很糟糕,就像去一个20年前的处理器。。。那么,那些用动态分配移植C++应用程序的人会做什么呢?(对于可以用手计数的数组中的极少数双打)
标准方法是更改代码中对象的范围和生命周期,这样就不需要在设备上连续创建和销毁对象作为计算的一部分。在大多数分布式内存体系结构(CUDA、HPC集群等)中,内存分配是昂贵的,通常的解决方案是尽可能节约地使用它,并通过延长对象的寿命来摊销操作成本。
理想情况下,在编程开始时创建所需的所有对象,即使这意味着预先分配一个对象池,这些对象将在程序运行时使用。这比自组织内存分配和释放更有效。它还避免了内存碎片的问题,这在页面大小相当大的GPU硬件上可能会成为一个问题。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存