到目前为止,我的经验告诉我,即使使用多核处理器,并行化算法并不总能显着加快速度。事实上,有时它会减慢速度。通过并行化可以显着加快算法的一些好的提示?
(当然,考虑到过早优化的警告及其与邪恶的相关性)
答案 0 :(得分:5)
为了从并行化中获得最大收益,任务应该能够被分解为类似的大小的课程 - 块粒子块,这些块是独立的(或者大部分是这样),并且需要很少的数据通信或块之间的同步。
细粒度并行化几乎总是会遇到增加的开销,并且无论可用的物理内核数量如何,都将具有有限的加速。
[对此的警告,那些具有非常大的没有的架构。 “核心”(例如连接机器64,000个核心)。这些非常适合于可以分解为分配给特定拓扑(如矩形网格)的相对简单的动作的计算。]
答案 1 :(得分:3)
如果你可以将作品分成独立的部分,那么它可以很好地并行化。
还要记住Amdahl's Law,这是一个清醒的提醒,通过为大多数程序添加更多内核,我们在性能提升方面的预期很少。
答案 2 :(得分:2)
首先,看看已故吉姆格雷的这篇论文:
Distributed Computing Economics
实际上,这将根据您在问题中所写的内容消除一些误解。显然,如果你的问题设置越不适合离散化,那就越困难。
答案 3 :(得分:2)
每当你有依赖于先前计算的计算时,它就不是并行问题。线性图像处理,强力方法和遗传算法等都很容易并行化。
一个很好的类比是你可以做些什么,你可以让一群朋友一次做不同的部分?例如,如果不同的人可以在不同的部分工作,将ikea家具放在一起可能会很好地平行,但滚动壁纸可能不会因为你需要按顺序做墙。
答案 4 :(得分:1)
如果您正在进行大型矩阵计算,例如涉及有限元模型的模拟,这些通常可以直接分解为更小的部分。假设您正在处理非常大的矩阵,矩阵向量乘法可以很好地从并行化中受益。除非存在导致代码运行缓慢的真正性能瓶颈,否则可能没有必要为并行处理而烦恼。
答案 5 :(得分:0)
好吧,如果你需要很多锁才能工作,那么它可能就是那些难以并行化的难算算法之一。算法的任何部分是否可以分解为不需要相互接触的单独部分?