如何在n个线程上均匀分配n对象的全对测试工作?

时间:2014-03-18 02:29:59

标签: multithreading algorithm parallel-processing

来自一组n对象的所有可能(无序)对的典型单线程循环如下所示:

for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
        ProcessPair(i, j);

现在说你有n个帖子可供你使用。并行实现上述内容的显而易见的方法是:

for (int j = threadIndex + 1; j < n; j++)
    ProcessPair(threadIndex, j);

但是这不会在线程之间均匀分配工作。第一个线程将处理n-1个对,而最后一个线程将不处理任何对。

是否有一种简单的方法可以对n(n-1)/2对进行分区,使每个线程处理相同数量的对(±1)并且可以根据其{{1}来确定它应该处理哪些对。 1}}和threadIndex

这个有趣的问题出现了,因为我在GPU上玩物理并开始实施强力全对碰撞检测(我知道,我应该使用宽相算法)。我认为combinatorial number system可能是关键,但我不能完全适应所有部分。

1 个答案:

答案 0 :(得分:3)

我玩了一下它,我有一个似乎是正确的解决方案。我没有工作证明或平衡的证据,但就我所知,它在逻辑上是有道理的。

用语言说: 如果你是一个偶数索引,检查所有比你小的索引和所有比你大的奇数索引。如果您处于奇数指数,请检查小于您的所有奇数指数以及比您大的所有偶数指数。

很容易看出每个线程将与大多数N / 2个其他线程进行比较,因为我们以2为步长遍历整个列表。