gpt4 book ai didi

c++ - CUDA 对许多小型数组求和

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:52 25 4
gpt4 key购买 nike

我有一个下面的数组,它由 16 个元素组成,实际上是由许多小数组组成的:

[1,1,1,1|2,2,2,2,2,2|3,3,3,3,3,3|4,4,4,4]

实际上,数组很长,大约 512 或 1024,总数组长度小于最大块大小,因此小于 1024。数组驻留在共享内存中,因为它是先前计算的结果。除了 first 和 last 之外的每个子数组都具有相同的大小,并且所有子数组都具有偶数个元素。

在一个 CUDA block 中,我想对这个数组求和,使得结果为

[4,...|12,...|18,...|16,...]

如果子数组的长度是 2 的幂,那将没有问题,但事实很少如此,因此一种选择是用 0 填充数组,这样子数组的长度将是两个的幂:

[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 个,这会浪费大量的处理能力和共享内存。

有没有人看到对这样的数组求和的有效解决方案?

最佳答案

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

  1. 确定您的元素是否是序列中的最后一个(通过读取它和下一个元素)
  2. 使用投票确定 warp 中的哪些线程具有转换
  3. 与整个区 block 共享 warp 的投票结果(每个 warp 只有一条 channel 将其写入共享内存中的适当位置)
  4. “搜索”整个 block 的最后一个段的位图,从您的位置向后,找到之前的转换。
  5. 现在您知道段中的元素数量;将其乘以元素的值并写入结果。

还有一些更多的细节,比如最后一个 block 中的变化,但我认为这应该做得很好。

关于c++ - CUDA 对许多小型数组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45128048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com