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