CUDA 用大数组的内容填充小数组

CUDA populate small array with contents of larger array

我是 CUDA 编程的新手,所以如果这是一个愚蠢的问题,请原谅我。

在 CUDA 中,我试图用大型设备阵列 A(~2000 万 int 元素)的内容填充小型设备阵列 B(~20000 int 元素)。 A 主要包含零,但有大约 ~20000 个非零元素,位于数组中的随机和未知位置。我想使用 CUDA 用 A 的非零内容填充 B。 B 中元素的顺序并不重要。

我查看了 SDK,发现了一些 "reduce" 策略,例如,数组的并行求和,但这些方法中的每一种都将数组缩减为标量,而我试图 "reduce" 一个数组到一个更小的数组。网上搜索也没有任何结果。我不是在寻找完整的代码,而是在寻找一些 ideas/links 如何实现它。我正在使用 C,如果可能的话,我想在不使用任何 C++ 类 或结构的情况下执行此操作。

提前感谢您的帮助。

您所描述的有时称为 stream compaction

Thrust(例如copy_if)和

cub(例如DeviceSelect)提供应该具有相对较好性能的选项。

如果您确实想自己实现它,流压缩可能会使用一系列较低级别的并行操作,其中一个关键是前缀和。您可以在 GPU Gems 中了解简单并行前缀和(和流压缩)的构建。我只是为了提供信息而添加这个;我并不是建议您自己实现流压缩或前缀和。