smi*_*dha 5 algorithm cuda gpu thrust cudpp
我正在使用CUDA/Thrust/CUDPP.据我所知,在Stream压缩中,数组中的某些项被标记为无效,然后被"删除".
现在"删除"究竟意味着什么?假设原始数组A
并且长度为6.如果2个元素无效(根据我们可能提供的任何条件)那么
系统是否在GPU内存中创建一个大小为4 的新数组来存储有效元素以获得最终结果?
或者它是否从内存中物理删除了无效元素,并将原始数组A缩小到4,只保留有效元素?
对于任何一种情况,这是否意味着动态内存分配正在引擎盖下?但我听说在CUDA世界中不可能进行动态内存分配.
首先,计算能力 2.0 及更高版本设备上的 CUDA 可以进行动态内存分配。CUDA运行时库支持__device__
函数中的malloc/free和new/delete。但这实际上与答案无关。
通常会提供足够大的输出数组(预先分配,通常与输入数组的大小相同),并将输出写入其中。不需要动态分配,但存在潜在的存储浪费。这就是 CUDPP 和推力的作用。另一种方法是首先执行有效元素的计数,然后使用从主机 CPU 调用的 cudaMalloc 动态分配输出 GPU 内存。