5

我正在使用 CUDA/推力/CUDPP。据我了解,在流压缩中,数组中的某些项目被标记为无效,然后被“删除”。

现在“删除”在这里的真正含义是什么?假设原始数组A的长度为 6。如果 2 个元素无效(无论我们提供什么条件),那么

  1. 系统是否在 GPU 内存中创建一个大小为 4 的数组来存储有效元素以获得最终结果?

  2. 或者它是否从内存中物理删除无效元素并将原始数组 A 缩小到 4 大小,只保留有效元素?

无论哪种情况,这是否意味着动态内存分配正在幕后发生?但我听说动态内存分配在 CUDA 世界中是不可能的。

4

1 回答 1

4

首先,在 Compute Capability 2.0 及更高版本的设备上,CUDA 可以进行动态内存分配。CUDA 运行时库支持 malloc/free 和 new/delete__device__函数。但这与答案无关,真的。

通常会提供足够大的输出数组(预先分配,通常与输入数组大小相同)并将输出写入其中。不需要动态分配,但存在潜在的存储浪费。这就是 CUDPP 和推力所做的。另一种方法是首先执行有效元素的计数,然后使用从主机 CPU 调用的 cudaMalloc 动态分配输出 GPU 内存。

于 2011-12-06T07:13:13.737 回答