【问题标题】:Possible to distribute or parallel process a sequential program?可以分发或并行处理顺序程序吗?
【发布时间】:2011-01-28 17:00:16
【问题描述】:

在 C++ 中,我编写了一个数学程序(用于扩散受限聚合),其中计算的每个新点都依赖于前面的所有点。 是否可以让这样的程序以并行或分布式方式工作以提高计算速度? 如果是这样,我需要对代码进行哪些类型的修改?

编辑:我的源代码可在... http://www.bitbucket.org/damigu78/brownian-motion/downloads/ 文件名是 DLA_full3D.cpp 如果需要的话,我不介意进行重大的重写。毕竟,我想学习如何去做。

【问题讨论】:

  • 不看源码?你打赌...

标签: c++ distributed parallel-processing


【解决方案1】:

如果你的算法基本上是顺序的,你就不能让它基本上不是那个。

你使用的是什么算法?

编辑:谷歌搜索“扩散受限聚合算法并行”引导我 here,引用以下内容:

另一方面,DLA 已显示 [9,10] 属于 本质上是顺序的,或者更多 正式地,P-完全问题。 因此,DLA 不太可能 集群可以并行采样 限制为 a 时的 polylog 时间 处理器多项式中的数量 系统大小。

所以你的问题的答案是“所有迹象都指向否”。

【讨论】:

    【解决方案2】:

    大概吧。大多数顺序算法都有并行版本,对于那些不能立即并行化的顺序算法,通常有并行替代品。这看起来像是在选择算法之前需要考虑并行化或可并行性的情况之一。但是,除非您告诉我们一些(很多?)更多关于您的算法的信息,否则我们无法提供太多具体的指导。如果您在没有硬数据的情况下观看 SO 人员争论很有趣,请坐下来观看,但如果您想要答案,请编辑您的问题。

    toxiclibs 网站提供了一些关于如何完成 DLA 实施的有用见解

    【讨论】:

      【解决方案3】:

      cilk,它是对 C 语言(不幸的是,还不是 C++)的增强,它允许您在代码中添加一些额外的信息。只需几个小提示,编译器就可以自动并行化部分代码,例如并行而不是串行运行 for 循环的多次迭代。

      【讨论】:

        【解决方案4】:

        在不了解您的问题的情况下,我只想说这看起来是作为并行前缀扫描 (http://en.wikipedia.org/wiki/Prefix_sum) 实现的不错选择。最简单的例子是一个数组,你想从中得出一个运行总和:

        1 5 3 2 5 6

        变成

        1 6 9 11 16 22

        这看起来本质上是串行的(因为所有点都依赖于前面的点),但它可以并行完成。

        【讨论】:

          【解决方案5】:

          你提到每一步都依赖于前面所有步骤的结果,这使得这样的程序很难并行化。

          我不知道您使用的是哪种算法,但您可以使用多线程来加速。每个线程将处理一个步骤,但必须等待尚未计算的结果(尽管如果它们不随时间改变值,它可以与已经计算的结果一起工作)。这实质上意味着您必须使用锁定/等待机制来等待尚未计算但某个工作线程当前需要继续执行的结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-15
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 2023-02-22
            • 2021-11-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多