来自一组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可能是关键,但我不能完全适应所有部分。
答案 0 :(得分:3)
我玩了一下它,我有一个似乎是正确的解决方案。我没有工作证明或平衡的证据,但就我所知,它在逻辑上是有道理的。
用语言说: 如果你是一个偶数索引,检查所有比你小的索引和所有比你大的奇数索引。如果您处于奇数指数,请检查小于您的所有奇数指数以及比您大的所有偶数指数。
很容易看出每个线程将与大多数N / 2个其他线程进行比较,因为我们以2为步长遍历整个列表。