我有一个大小为MxN的二维数组,其中N是2的幂大于或等于16而M是一个任意整数,它不是2的幂。例如,数组A的大小可能是200x32。
我想通过在数组的行中执行reduce(add)操作来将数组A减小到1x32的大小。我遇到的大多数减少都是通过使用Blelloch / Hillis扫描算法添加连续元素将数组减少到单个值。但就我而言,后续元素是不相关的,无法添加。但是,我需要添加元素[1,33,65 ...]和元素[2,34,66 ..]等等。
由于这不是合并访问,解决此问题的最佳方法是什么?
答案 0 :(得分:2)
它合并了:
WorkItem1 -> 1 + 33 + 65 + ...
WorkItem2 -> 2 + 34 + 66 + ...
WorkItem3 -> 3 + 35 + 67 + ...
...
正如您所看到的,一组线程中的所有内存操作都是连续的内存位置。
另外,为了进一步优化,你可以尝试进行向量运算,但我的猜测是编译器已经自己优化了它。