我有一个跟随数组,由16个元素组成,实际上是由许多小数组组成的:
[1,1,1,1|2,2,2,2,2,2|3,3,3,3,3,3|4,4,4,4]
实际上,阵列很长,大约512或1024,总阵列长度小于最大块大小,因此小于1024.阵列驻留在共享内存中,因为它是先前计算的结果。除了第一个和最后一个之外,每个子阵列具有相同的大小,并且所有子阵列具有偶数个元素。
在一个CUDA块中,我想对这个数组求和,以便得到结果
[4,...|12,...|18,...|16,...]
如果子阵列的长度为2的幂,则没有问题,但这很少是事实,因此一个选项是用数组填充数组,使得子阵列具有权力的长度两个:
[1,1,1,1|2,2,2,2,2,2,0,0|3,3,3,3,3,3,0,0|4,4,4,4]
但是,如果我有长度为34的子数组,那么浪费了大量的处理能力和共享内存,我将添加到每个30 0值元素中以填充多达64个。
有谁看到任何有效的解决方案来总结这样的数组?
假设块的总长度是固定的(在运行时但在启动之前或在编译时),为什么不执行以下操作(对于每个线程)? :
还有一些细节,比如最后一个块如何改变,但我认为应该做得很好。