CUDA流压缩:理解概念

smi*_*dha 5 algorithm cuda gpu thrust cudpp

我正在使用CUDA/Thrust/CUDPP.据我所知,在Stream压缩中,数组中的某些项被标记为无效,然后被"删除".

现在"删除"究竟意味着什么?假设原始数组A并且长度为6.如果2个元素无效(根据我们可能提供的任何条件)那么

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

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

对于任何一种情况,这是否意味着动态内存分配正在引擎盖下?但我听说在CUDA世界中不可能进行动态内存分配.

har*_*ism 4

首先,计算能力 2.0 及更高版本设备上的 CUDA 可以进行动态内存分配。CUDA运行时库支持__device__函数中的malloc/free和new/delete。但这实际上与答案无关。

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