4

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

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

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

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

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

4

1 回答 1

1

使用原子增量从全局数组中重复保留一对听起来非常慢。

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

我也在考虑两次处理数据:第一次只是为了确定每个输入记录的输出记录数。然后分配足够的空间,最后再次处理所有数据。

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

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

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

祝你好运!

于 2015-05-13T01:20:55.690 回答