我正在使用 CUDA/Thrust/CUDPP。据我了解,在 Stream 压缩中,数组中的某些项目被标记为无效,然后被“删除”。
现在“移除”在这里的真正含义是什么?假设原始数组 A
的长度为 6。如果 2 个元素无效(无论我们提供什么条件),则
系统是否在 GPU 内存中创建一个大小为 4 的新数组来存储有效元素以获得最终结果?
或者它是否从内存中物理移除无效元素并缩小原始数组 缩小到 4 号只保留有效元素?
对于这两种情况,这是否意味着动态内存分配是在后台进行的? 但我听说在 CUDA 世界中动态内存分配是不可能的。
最佳答案
首先,在 Compute Capability 2.0 和更高版本的设备上,CUDA 中可以进行动态内存分配。 CUDA 运行时库支持 __device__
函数中的 malloc/free 和 new/delete。但这与答案无关,真的。
通常提供足够大的输出数组(预先分配,通常与输入数组大小相同)并将输出写入其中。不需要动态分配,但可能存在存储浪费。这就是 CUDPP 和推力所做的。另一种方法是先对有效元素进行计数,然后使用从主机 CPU 调用的 cudaMalloc 动态分配输出 GPU 内存。
关于algorithm - CUDA 流压缩 : understanding the concept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8388125/