有没有有效的方法来压缩OpenCL / CUDA中的稀疏数组?

时间:2018-05-18 17:18:05

标签: algorithm cuda opencl gpu gpgpu

问题

假设我在全局内存中有一个大数组,大部分都是0,但有一些元素(25%)是数字:

[9, 0, 0, 0, 7, 0, 0, 3, 0, 0, 0, 0, 5, 0, 0, 0, 8, 0, 2, 0, 0, 4, 0, 0, 0, 0, 5]

是否有任何有效的内核通过移动数字来压缩该数组> 0到左侧?

[9, 7, 3, 5, 8, 2, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我尝试了什么

我认为在许多潜在的解决方案中,通常从二进制缩减算法中获取灵感,但那些并不真正适用,因为我没有将所有数字压缩成一个,而是很多。例如,半完整的初始数组不会发生很大变化。当然,一种方法是将数组移动到CPU并应用明显的顺序算法:

var j = 0;
var x = 0;
for (int i = 0; i < len; ++i) {
  if (arr[i] !== 0) {
    x      = arr[j];
    arr[j] = arr[i];
    arr[j] = x;
  }
  if (arr[j] > 0) {
    j += 1;
  }
}

但对于足够大的数组而言,开销可能很大。我找不到任何需要少于O(N)内核调用的解决方案。

0 个答案:

没有答案