作者:Rio
在过去的很多年里,软件性能的提升很大程度上源自处理器速度的增长。软件工程师面对客户抱怨说软件运行得太慢的通常回答是:升级你的系统。
然而现在由于处理器速度逐渐逼近物理极限,继续提高处理器的时钟速度会导致发热量显著增加,甚至核心熔化。江郎才尽的硬件工程师想出了一个能保住自己饭碗的办法:既然不能提高单个核心的速度,那就在一个处理器里面封装多个核心。于是我们进入了多核处理器的时代。
现在犯难的就是软件工程师了:没有了处理器速度不断提升的免费便车,接下来不得不面对的问题就是如何有效地利用处理器里面的多个核,也就是并行计算。并行计算最核心的问题是如何将计算任务迅速有效地分发到处理器的各个核心,使得总利用率最大化。类似 Cilk 和 OpenCL 这类的并行计算标准试图帮助长期以来习惯于线性编程的软件工程师们平滑地过度到多核时代。
然而多核仍然面对一个似乎无法回避的难题:阿姆达定律(Amdahl's Law)。
阿姆达定律讲的是这么一件事:一个程序存在两部分,只能串行计算的部分 S,和能够并行计算地部分 P。两部分之和是整个程序,因此 S+P=1。这个程序如果在一个具有N个核心的处理器上运行,那么和它在一个单核处理器上运行相比,速度的提升是 1/(S
+ P/N)。当 N 趋近于无穷大时(即假设我们有无穷多个核心),速度提升的上限是 1/S,即速度提升的上限取决于程序不能被并行计算的部分。
这个定律的结果就是,即便我们能够有效地并行计算一个程序的 95%,剩下 5% 只能串行计算的部分限制了这个程序的运行速度最多能提升 1/5%=20 倍。而现有的程序中很少能够做到 95% 以上部分的并行计算。链接中这张图显示了对于4种不同类型的程序(分别有50%,75%,90%,95%的部分能够并行处理)的速度提升相对于处理器核心数量的关系,纵轴是相对于单核处理器速度提升的倍数,横轴是处理器核心的数量。可以看到4条曲线随着处理器核心数量的增加逐渐趋于平坦。
现在的多核处理器还远远没到拥有 1,000 个核心的时候。然而未来的某一天,不管是软件还是硬件工程师们也许会满头大汗地向客户解释这个问题:为什么最新的 1,000 核处理器比旧的 100 核处理器快不了多少?