【问题标题】:How to traverse a graph in parallel with 2 or n processes如何与 2 个或 n 个进程并行遍历图
【发布时间】:2012-11-30 17:23:56
【问题描述】:

我正在互联网上搜索,以找到一些算法,该算法可以使用 2 个或 n 个进程并行遍历一个图,而无需一个进程进入另一个进程先前访问过的节点,这样我就可以加快整个扫描任务的速度整个图表,但我找不到任何东西。有没有什么算法可以帮助我并行完成这样的任务?值得吗?

注意: n 个进程共享访问和访问节点的相同内存

谢谢

【问题讨论】:

  • 您还应该指出您的内存模型是什么。是共享内存吗?
  • 我认为这种情况看起来像是生产者消费者问题,但如果我让进程相互等待,那么值得吗?
  • 我确实会尝试以生产者消费者的身份进行操作,但是以块而不是单个元素的形式从队列中写入和读取,并在添加时做一些额外的工作以确保元素不会被访问,因为它上次检查
  • 是的,它们之间可以有多个循环
  • 这个问题已经被回答(接受),但我只是想知道你是否在修改实际的数据图。你的遍历是只读的吗?

标签: algorithm graph-algorithm


【解决方案1】:

您可以尝试使用消费者-生产者模型来遍历图 - 但要对纯模型进行一些修改:

  • 以块为单位读取和写入队列,而不是一次一个元素,也会更新以块为单位的visited 集。它将为您节省同步时间 - 需要减少同步时间。
  • 当您修改队列(和 visited 集)时 - 您应该做一些额外的工作以确保您不会添加自上次检查该集以来已经访问过的数据。

请注意,使用这种方法 - 您更有可能多次搜索某些顶点 - 但您可以将其与队列和 visited 集合的更新频率绑定。

值得吗?在这些事情上很难说 - 它取决于很多事情(图结构、大小、队列实现......)。

您应该运行一些测试并尝试微调“更新频率”的参数,并根据经验检查哪个更好。您应该使用statistical toolswilcoxon test 通常是这方面的事实标准)并确定一个是否比另一个更好。

【讨论】:

    【解决方案2】:

    除非大部分时间花在实际遍历上,否则您可以在单个线程上遍历图形,并将每个节点的工作排队,以便从多个进程并行处理。在队列中完成工作后,您可以使用简单的生产者-消费者模型。

    【讨论】:

    • 所以你说我需要将收集每个进程的节点的工作拆分为n个进程,并收集单个进程要访问的新节点?
    • 这样的模型可以使图遍历保持简单(使用您现在使用的任何算法),并且可以轻松地并行化每个节点上正在执行的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2016-07-23
    • 2020-08-24
    • 2010-12-12
    相关资源
    最近更新 更多