【问题标题】:Parallel union find algorithm并行联合查找算法
【发布时间】:2014-02-12 14:29:55
【问题描述】:

我需要并行化 kruskal 的算法,串行版本使用 union find 算法来检测无向图中的循环。有什么办法可以并行化这部分代码吗?

【问题讨论】:

  • 好问题!但是您能否向我们展示您迄今为止的尝试代码?
  • 由于Disjoint-set_data_structure 的所有功能几乎都在恒定时间内(但初始化)。我想知道对这些函数进行并行处理是否有意义......可以对边缘进行并行处理。

标签: c++ c graph parallel-processing graph-algorithm


【解决方案1】:

嗯,它可以在某种程度上并行化。如下:

最初所有的边都按升序排序。有一个main thread 实际上从头开始扫描每个边并决定添加当前边是否形成循环。我们并行化算法的主要目的是使这些检查并行化。

这是我们使用worker threads 的地方。每个线程都有一定数量的边进行检查,其中每个线程在每次迭代后检查其边是否与当前表示形成一个循环(迭代意味着主线程添加新边)。随着主线程不断添加边,一些线程看到某些边已经与当前表示形成了一个循环。

这些边被标记为discarded。当主线程到达这样的边缘时,它只是移动到下一个而不对其进行任何检查。

因此,我们实际上使这些检查并行化,这意味着算法运行得很快,提高了效率。

其实有一个nice paper使用了上述相同的思路。

编辑:

如果您非常关心整体算法的运行时间,您甚至可以按照@jarod42 的建议开始使用并行排序算法。

【讨论】:

  • 这个方法用openMP容易吗?我的意思是,按计划管理线程似乎很困难..
  • @Betelgeuse 您只需创建线程并为每个线程分配特定数量的边。一种分配方式是串行的。他们将在添加新边缘后进行检查。如果分配给一个线程的所有边都被主线程完全处理,则终止相应的工作线程。我想这很容易!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多