C++ CUDA对许多小型阵列进行求和
我有一个数组,它由16个元素组成,实际上是由许多小数组组合而成的: [1,1,1,1 | 2,2,2,2,2,2 | 3,3,3,3,3 | 4,4,4] 实际上,一个数组相当长,大约512或1024,总数组长度小于最大块大小,因此小于1024。数组驻留在共享内存中,因为它是以前计算的结果。每个子阵列(第一个和最后一个除外)都具有相同的大小,并且所有子阵列都具有偶数个元素 在一个CUDA块中,我想对这个数组求和,这样结果就是 [4,…12,…18,…16,…] 如果子阵列的长度为2的幂的长度,则没有问题,但这很少是事实,因此一种选择是用0填充阵列,使子阵列的长度为2的幂: [1,1,1,1 | 2,2,2,2,0,0 | 3,3,3,3,0,0,0 | 4,4] 但是,如果我有长度为34的子数组,并且我会将每个30个值的元素添加到64个,那么这将浪费大量的处理能力和共享内存C++ CUDA对许多小型阵列进行求和,c++,parallel-processing,cuda,reduce,reduction,C++,Parallel Processing,Cuda,Reduce,Reduction,我有一个数组,它由16个元素组成,实际上是由许多小数组组合而成的: [1,1,1,1 | 2,2,2,2,2,2 | 3,3,3,3,3 | 4,4,4] 实际上,一个数组相当长,大约512或1024,总数组长度小于最大块大小,因此小于1024。数组驻留在共享内存中,因为它是以前计算的结果。每个子阵列(第一个和最后一个除外)都具有相同的大小,并且所有子阵列都具有偶数个元素 在一个CUDA块中,我想对这个数组求和,这样结果就是 [4,…12,…18,…16,…] 如果子阵列的长度为2的幂的长度,则
是否有人看到任何有效的方法来求和这样的数组?假设块的总长度是固定的(在运行时但在启动之前,或在编译时),为什么不(针对每个线程)执行以下操作呢
还有一些细节,比如在最后一个块中如何更改,但我认为这应该很好。子数组的值是否来自以前已知的一组值,以便可以通过枚举来描述这些值?如果是这样的话,原子操作可能会有所帮助。不,它们是预先计算的,为了更清晰起见,这里的值会重复。不管怎样,我终于找到了一个相当快的解决方案,如果有人遇到同样的问题,我会很快发布