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