Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA对许多小型阵列进行求和_C++_Parallel Processing_Cuda_Reduce_Reduction - Fatal编程技术网

C++ CUDA对许多小型阵列进行求和

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的幂的长度,则

我有一个数组,它由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个,那么这将浪费大量的处理能力和共享内存


是否有人看到任何有效的方法来求和这样的数组?

假设块的总长度是固定的(在运行时但在启动之前,或在编译时),为什么不(针对每个线程)执行以下操作呢

  • 确定元素是否是序列中的最后一个(通过读取它和下一个元素)
  • 使用抽签确定扭曲中的哪些线程具有过渡
  • 与整个块共享warp的投票结果(每个warp只有一个通道将其写入共享内存中的适当位置)
  • 从您的位置向后“搜索”整个块段中最后一个位图,以查找上一个过渡
  • 现在,您知道了细分市场中的元素数量;将其乘以元素的值并写入结果

  • 还有一些细节,比如在最后一个块中如何更改,但我认为这应该很好。

    子数组的值是否来自以前已知的一组值,以便可以通过枚举来描述这些值?如果是这样的话,原子操作可能会有所帮助。不,它们是预先计算的,为了更清晰起见,这里的值会重复。不管怎样,我终于找到了一个相当快的解决方案,如果有人遇到同样的问题,我会很快发布