CUDA线程将可变数量的数据附加到公共数组

时间:2013-04-02 15:12:02

标签: arrays hash cuda thrust

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

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

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

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

但是我并不期待实现这一点。救命?感谢。

1 个答案:

答案 0 :(得分:1)

  

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

您可以一次增加全局数组的bin而不是一个条目。换句话说,您可以拥有一个大型数组,每个线程可以从10个可能的输出条目开始。如果线程流过它,则从全局数组请求下一个可用的bin。如果你担心1原子序数的速度慢,你可以使用10个原子序数到10个数组部分并分配访问。如果一个人满员,找另一个。

  

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

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

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

当然,全球记忆的分布部分的下行就像talonmies所说的......你需要聚集或压缩才能使结果密集。

祝你好运!