并行计算总出现次数

时间:2014-03-31 19:07:24

标签: c cuda

我有一个并行算法,可以输出1到1000的随机数。 我的目标是为算法的N次执行计算每个数字的选择次数。 因此,例如,我在100个线程上执行N / 100执行算法,最终结果是1000个int的数组,这是每个数字的出现。

有没有办法智能地并行化这个?例如,如果我只使用一个全局数组,那么每次我想在其中写入时都必须锁定它,这将使我的算法运行几乎就像没有并行化一样。在另一方面,我不能只为每个线程创建一个1000个数字的数组,只是让它们填充1%并在最后合并它们。

有什么提示吗?谢谢!

2 个答案:

答案 0 :(得分:3)

这似乎是直方图。如果您想快速执行此操作,请使用CUBThrust等库。

对于存在少量容器的情况,一种方法是让每个线程在其自己的一组容器上操作,用于输入的一部分。然后对每个箱子进行平行减少。如果您对垃圾箱的存储组织很聪明,则并行减少相当于矩阵列的总和:

                Bins:
         1     2    3    4   ...   1000
  T 1
  h 2
  r 3
  e .
  a .
  d 100

在上面的例子中,每个线程获取一段输入,并对部分和矩阵的一行进行操作。

当所有线程完成它们的段时,然后对矩阵的列求和,这可以使用简单的for循环内核非常有效和快速地完成。

答案 1 :(得分:-1)

你可以做几件事。 如果你想要尽可能的便携,你可以为每个索引锁一个。

如果在Windows系统上运行,我建议InterlockedIncrement