元素之间的多线程强力比较以创建图形

时间:2013-01-22 21:19:33

标签: c++ multithreading algorithm graph-algorithm

我有N个元素需要相互比较才能创建图表。它总共给出(N * N-1)/ 2 比较。

我想多线程那些比较我也有几个限制:

  • 每个元素都很大,实际上它是一个矩阵,因此复制每个线程中的所有元素会占用太多内存。

  • 每次比较都应该发生,这意味着我不能跳过一次。

  • 每次可以在列表中添加新元素时,这非常棘手,因为我需要跟踪已经完成的工作,只做新工具。

  • 由于比较的数量可能很大,比如2000万,我的队列也不大。

  • 最后,我可以随时停止这个过程,我必须能够恢复我在应用程序的其他执行中的位置。

到目前为止,我有一个主线程,其中包含线程池中的所有元素和几个worker。工作线程比较对列表或一系列元素。我想到了一个比较生成器,可以按需提供下一个X比较。

我该如何构建这个生成器?

我应该为工作人员复制每一对,直接从工作人员使用ReadWriteLock来读取Master中的数据吗?

我如何跟踪每个帖子的进度?

我怎样才能停止并恢复比较状态?

如果这是很多问题,我很抱歉。 谢谢!

1 个答案:

答案 0 :(得分:0)

假设读取是线程安全的(通常只要没有人编写),一个简单的解决方案是以某种方式在工作线程集中细分任务,事先这样做。例如,对于 n worker,您可以将pair( x y )分配给worker x mod 名词的。唯一的沟通是让每个工人知道它的序数(0 ... n -1)。每个线程都应该将其答案放入一个私有数组中,这可以在其他人完成后进行整理。

适应不同工人生产率的更复杂的模型是将每个值0 ... N -1推送到队列中。每个工作线程从队列中提取一个数字 x ,评估每个( x y )对,然后返回另一个< EM> X

如果你想花时间,那么排队对就更有效率,以便最大限度地减少缓存抖动。这是一个棘手的问题。实际上,您希望从小的元素集群中排列对,以便在大致相同的时间对集群中的每个对进行评估。虽然这很棘手,但它可能会对算法的效率产生巨大影响。