什么是算法并行化的一些提示?

5

我的经验表明,即使使用多核处理器,将算法并行化并不总是能够显着提高其速度。事实上,有时它会减慢速度。那么,有哪些好的提示可以表明通过并行化可以显著加快算法的速度呢?

(当然,需要注意过早优化的缺点及其与恶的相关性)

6个回答

5
为了从并行化中获得最大的效益,一个任务应该能够被分成大小相似、独立或几乎独立的粗颗粒块,并且在这些块之间需要很少的数据通信和同步。
细粒度并行化几乎总是会增加开销,并且无论物理核心的数量如何都会有有限的加速比。
唯一的例外是那些拥有非常多核心(例如连接机器的64,000个核心)的架构。这些架构非常适合于将计算分解为相对简单的操作,并分配到特定的拓扑结构(如矩形网格)。

3

如果你能将工作分成独立的部分,那么它可能会很好地并行化。

还要记住 阿姆达尔定律,它提醒我们,在大多数程序中添加更多核心所能带来的性能增益是微不足道的。


我完全同意这里的观点。然而,需要注意的一点是,在Atwood的博客中,他经常忽略的一点是,你的程序通常会与其他不相关的进程竞争,因此你也可以从多个核心中获得收益。但是,是的,大部分时间都花在代码最慢的部分上。 :) - BobbyShaftoe

2

首先,看看已故的Jim Gray写的这篇论文:

分布式计算经济学

实际上,这将消除你在问题描述中所写的一些误解。显然,如果你的问题集越不易离散化,那么它就会越困难。


2
任何时候,如果计算依赖于之前的计算,那么它就不是一个并行问题。像线性图像处理、暴力方法和遗传算法等都很容易并行化。
一个好的比喻是,你可以做什么工作,让一群朋友同时做不同的部分?例如,组装宜家家具可能很容易并行化,如果不同的人可以同时处理不同的部分,但是滚墙纸可能不行,因为你需要按顺序完成墙壁。

1
如果你正在进行大型矩阵计算,比如涉及有限元模型的模拟,这些通常可以通过简单的方式分解成较小的部分。矩阵向量乘法可以从并行化中受益良多,假设你正在处理非常大的矩阵。除非存在真正导致代码运行缓慢的性能瓶颈,否则可能没有必要费心进行并行处理。

我能理解你的逻辑。这是一个学校作业。如果有时间的话,我打算尝试一些并行处理的操作,如果这可以简单地完成并且能够显著提高速度的话。即使我没有找到最佳方案,我还可以说:“这是我尝试过的另一种方法,但并没有成功”。 - Jason Baker

0

如果你需要很多锁才能让它工作,那么它可能是一种不易并行化的复杂算法。算法中是否有可以分解成不需要相互影响的独立部分的部分?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接