我的应用程序需要数百万条输入记录,每个字节为8个字节,并将每个记录分成两个或多个输出区。也就是说,每个输入密钥K创建少量对(B1,K),(B2,K),...每个密钥的输出区间的数量在处理密钥之前是未知的。它通常是2但有时可能是10或更多。
所有这些输出对最终都需要存储在一个数组中,因为每个bin中的所有键稍后将被一起处理。如何有效地做到这一点?
使用原子增量从全局数组中重复保留一对听起来非常慢。另一个明显的方法是将哈希表初始化为每个bin的某种存储指针数组。这看起来很慢。
我正在考虑在块共享阵列中为每个输入记录预先保留2对,然后根据需要获取更多空间(即,重新实现STL向量保留操作),然后在每个块中复制最后一个线程块共享数组到全局内存。
但是我并不期待实现这一点。救命?感谢。
答案 0 :(得分:1)
使用原子增量从全局重复保留一对 阵列听起来非常慢。
您可以一次增加全局数组的bin而不是一个条目。换句话说,您可以拥有一个大型数组,每个线程可以从10个可能的输出条目开始。如果线程流过它,则从全局数组请求下一个可用的bin。如果你担心1原子序数的速度慢,你可以使用10个原子序数到10个数组部分并分配访问。如果一个人满员,找另一个。
我也在考虑两次处理数据:第一次到 确定每个输入记录的输出记录数。然后 分配足够的空间,最后再次处理所有数据。
这是另一种有效的方法。一旦获得每个线程的结果总数,瓶颈就是计算每个线程到全局数组的偏移量。我没有想出一个合理的平行方式来做到这一点。
我能想到的最后一个选项是分配一个大型数组,基于块分配它,使用共享原子int(有助于缓慢的全局原子)。如果空间不足,请标记该块未完成,并标记其停止的位置。在下一次迭代中完成尚未完成的工作。
当然,全球记忆的分布部分的下行就像talonmies所说的......你需要聚集或压缩才能使结果密集。
祝你好运!