arrays - CUDA 线程将可变数量的数据附加到公共(public)数组

标签 arrays hash cuda thrust

我的应用程序需要数百万条输入记录,每条记录 8 个字节,并将每条记录散列到两个或更多输出箱中。也就是说,每个输入 key K 创建少量的对 (B1,K)、(B2,K)... 每个 key 的输出 bin 数量在处理该 key 之前是未知的。通常是 2 个,但有时可能是 10 个或更多。

所有这些输出对最终都需要存储在一个数组中,因为每个 bin 中的所有键稍后都会一起处理。如何有效地做到这一点?

使用原子增量从全局数组中重复保留一对听起来非常慢。另一个明显的方法是将哈希表初始化为指向每个容器某种存储的指针数组。看起来比较慢。

我正在考虑在 block 共享数组中为每个输入记录预先保留 2 对,然后根据需要获取更多空间(即重新实现 STL 向量保留操作),然后让每个 block 中的最后一个线程进行复制 block 共享数组到全局内存。

但是我并不期待实现这一点。帮助?谢谢。

最佳答案

Using an atomic increment to repeatedly reserve a pair from a global array sounds horribly slow.

您可以增加全局数组的 bin,而不是一次增加一个条目。换句话说,您可以有一个大数组,每个线程可以从 10 个可能的输出条目开始。如果线程溢出,它会从全局数组中请求下一个可用的 bin。如果您担心 1 个原子序数的速度慢,您可以将 10 个原子序数用于数组的 10 个部分并分配访问。如果一个吃饱了,再找一个。

I'm also considering processing the data twice: the 1st time just to determine the number of output records for each input record. Then allocate just enough space and finally process all the data again.

这是另一种有效的方法。瓶颈是在获得每个线程的结果总数后计算每个线程到全局数组的偏移量。我还没有找到一个合理的并行方法来做到这一点。

我能想到的最后一个选项是分配一个大数组,基于 block 分配它,使用共享原子 int (将有助于缓慢的全局原子)。如果空间不足,请标记该 block 未完成,并标记它停止的位置。在下一次迭代中完成尚未完成的工作。

全局内存的分布式部分的缺点当然就像talonmies所说的那样......你需要聚集或压缩来使结果密集。

祝你好运!

关于arrays - CUDA 线程将可变数量的数据附加到公共(public)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767705/

相关文章:

php - 如何按值对关联数组的数组进行排序

java - 数组复制排除每个 x 元素

c# - HashAlgorithm.ComputeHash() 是线程安全的吗?

cuda - 我可以将现有的可分页内存转换为固定内存吗?

c++ - 如何使用 NVIDIA cuDNN 计算 'full' 卷积?

c++ - 如何使用模板正确定义函数

javascript - 如何将数组转换为树?

c - 反转数组 C

javascript - 带有 Html 基本标记的 Url 哈希

ruby - 在 ruby​​ 中使用带有默认值的选项散列作为参数的一种干净利落的方法是什么