在C ++中,我编写了一个数学程序(用于扩散限制聚合),其中计算的每个新点都依赖于所有前面的点。 是否可以让这样的程序以并行或分布式方式工作以提高计算速度? 如果是这样,我需要对代码进行哪种类型的修改?
编辑:我的源代码可在... http://www.bitbucket.org/damigu78/brownian-motion/downloads/ filename是DLA_full3D.cpp 我不介意重大的重写,如果这是它需要的。毕竟,我想学习如何做到这一点。
答案 0 :(得分:3)
如果你的算法基本上是连续的,你就不能从根本上做到这一点。
您使用的算法是什么?
编辑:谷歌搜索“扩散限制聚合算法并行”引导我here,引用如下:
另一方面,已经展示了DLA [9,10]属于该类 固有顺序或更多 正式地,P完全问题。 因此,DLA不太可能 群集可以并行采样 限制为a时的多队时间 处理器中的多项式数 系统规模。
所以你的问题的答案是“所有迹象都指向不”。
答案 1 :(得分:0)
可能。大多数顺序算法都有并行版本,对于那些不能立即并行化的顺序算法,通常有并行替代算法。这看起来像是在您选择算法之前需要考虑并行化或并行性的情况之一。但除非你告诉我们一些(很多?)更多关于你的算法,否则我们无法提供更具体的指导。如果让你看到SOers在没有硬数据的情况下争辩并观看,如果你想要答案,请编辑你的问题。
toxiclibs网站提供了有关如何完成一个DLA实施的有用见解
答案 2 :(得分:0)
有cilk,这是对C语言的增强(遗憾的是不是C ++(还)),它允许您向代码添加一些额外信息。只需几个小提示,编译器就可以自动并行化部分代码,例如并行运行for
循环的多次迭代而不是串行。
答案 3 :(得分:0)
在不了解您的问题的情况下,我只想说这看起来像是一个很好的候选者,可以作为并行前缀扫描(http://en.wikipedia.org/wiki/Prefix_sum)来实现。最简单的例子是你想要运行的数组:
1 5 3 2 5 6
变为
1 6 9 11 16 22
这本身就是连续的(因为所有的点都取决于之前的点),但它可以并行完成。
答案 4 :(得分:-1)
您提到每个步骤都取决于前面所有步骤的结果,这使得很难并行化这样的程序。
我不知道您使用的是哪种算法,但您可以使用多线程来加速。每个线程将处理一个步骤,但必须等待尚未计算的结果(尽管如果它们不随时间改变值,它可以与已经计算的结果一起使用)。这实际上意味着您必须使用锁定/等待机制才能等待尚未计算但当前需要某个工作线程继续进行的结果。