【问题标题】:Parallelizing a serial algorithm并行化串行算法
【发布时间】:2012-05-02 15:11:05
【问题描述】:

大家好,

我正在将文本挖掘/自然语言应用程序从单核移植到 Map-Reduce 样式系统。其中一个步骤涉及类似于以下的 while 循环:

Queue<Element>;

while (!queue.empty()) {
    Element e = queue.next();
    Set<Element> result = calculateResultSet(e);

    if (!result.empty()) {
        queue.addAll(result);
    }
}

每次迭代都取决于前一次的结果(种类)。无法确定此循环必须执行的迭代次数。

有没有一种方法可以并行化像这样的串行算法?我正在尝试考虑一种反馈机制,它能够提供自己的输入,但是如何将它并行化?

感谢任何帮助/评论

【问题讨论】:

  • 有什么理由不能只根据原始队列对工作进行分区吗?例如。排序很重要,原始队列是否很短,最短和最长运行时间之间会有很大差异吗?
  • Edvard,函数calculateResultSet()看的是整个输入集,在这一步开始之前需要完全计算。
  • 那么,按字母顺序添加元素,初始列表为[a,b,c]a 将评估[b,c]b 将评估[b,c,d,e](例如)等? calculateResultSet 可以开始处理不完整的数据(即它可以处理队列直到下一部分准备好)?我不确定它如何适合 MapReduce 范式,但似乎(也许)所有初始元素都可以开始处理它们的部分列表直到 a 完成,然后处理 a 直到 b 完成等等.
  • 就我目前所了解的应用程序而言,calculateResultSet() 需要准备好整个系列,因此实际上没有办法从半成品系列开始。我需要的是一种附加到地图操作输入的方法,但我不相信这是可能的。
  • 可以修改calculateResultSet吗?如果您不能,并且对calculateResultSet 的第 N 次调用需要 N-1 次先前调用的完整结果才能开始处理,那么您将陷入串行执行的困境。如果您可以修改calculateResultSet,您可以将其并行化,或处理数据直到可用队列结束并等待,处理先前执行产生的数据,并且仅在处理所有 N-1 个先前输出时才返回结果.

标签: algorithm mapreduce parallel-processing distributed-computing text-mining


【解决方案1】:

也许您可以将calculateResultSet 拆分为几个不同的函数,这些函数在整个集合上运行。这样,您可以为所有函数提供整个集合,并让每个函数执行单独的操作。所有函数完成后,您可以将所有结果提供给另一个函数以创建最终输出。这将允许您将数据发送到不同的节点,执行操作,最后使用分布式架构收集结果。

您还可以研究共享的概念。一个经典的例子是斐波那契数列,其中 xn 取决于 xn-1 和 xn-2。以下是使用 OpenMP 的并行化版本示例:http://myxman.org/dp/node/182

【讨论】:

    【解决方案2】:

    Mstoeckli 的建议很好。或者,如果您的数据真的很大,也许可以分割数据集并对集合的各个部分进行循环,然后以预定的迭代次数(或在某种停止标准之后)重新组合数据.

    您需要进行一些实验——有些问题即使有很多近似值也会很好,有些则根本不行。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多