本文由Yurii原创,转载请注明来源: Life Sailor

本文链接 一艘轮船横渡大洋需要七天,那么……


“一艘轮船横渡大洋需要七天,七艘轮船横渡大洋就只需要一天吗?”我第一次听到这个段子,是在湖南经视的某档娱乐节目(抨击的是某些专家的“唯数字论”),接下来又听到了那个著名的“吃狗屎与GDP”的例子,“所以,很多时候光靠数字是不能说明问题的”,主持人俨然一脸严肃。

一艘轮船横渡大洋需要七天,七艘轮船横渡大洋就只需要一天吗?面对这个问题,许多人的第一反应就是,“不对”。不对在哪里呢?仔细想想就会明白,“横渡大洋”的工作,没法分拆给七艘轮船来同时完成。
是了,这就是问题的核心(Nature)所在——无法拆分完成的任务,投入更多的劳动力,不见得会有成效。这道理看似简单,变换了情境,就不是如此了。

芯片制造工艺不断发展,在同样方寸内集中更多晶体管的做法已经遇到了瓶颈,人们对计算速度的渴望却永无满足,于是“多核(共享内存的多处理器)”应运而生。多核能给我们的编程带来多大好处?双核真的能比传统的单核快上一倍吗?Amdahl定律(Amdahl’s Law)告诉我们,这是不可能的:

设加速比(完成同样的任务,单处理器所需的时间与n个处理器所需的时间)为S,任务中能并行完成的部分为p。如果单处理器的完成时间为1个时间单位,则理想状态下n个处理器所需时间(不考虑多处理器间的协调成本)是
(1-p)+p/n
那么加速比S的上限就是它的倒数:
1/((1-p) + p/n)

具体到“横渡大洋”的问题,其中的p等于0,所以,7艘轮船的加速比为1,当然还是需要7天。

Morgan Kaufmann的这本书(The Art of Multiprocessor Programming),就以“加速比”和类似“轮船横渡”的例子开头,来介绍多核编程的。全书内容分为两大部分:理论与实践。理论部分关注可计算性——什么样的问题是能够在异步并发环境中完成的,读过这部分,你会明白,为什么有些共享对象无法以任何并发算法来实现,以后不必再白费工夫(It is therefore important to understand what not to try, before proceeding to write multiprocessor programs);实践部分关注并发程序的性能——单核编程依赖的是基础完备的成型抽象,许多东西已经是“约定俗成”;而多核则需要以另一种视角看待,有时程序甚至必须“欺骗(outwit)”内存系统,这样的程序,不熟悉多核结构的程序员可能很难读懂。

传统讲解多核、并发编程的书,大都偏重实践部分,而忽略了理论部分。结果就是,读完虽然知道一堆多线程编程的技巧,也能保证程序的正确性,总是一头雾水,不能有效分析、拆解问题(不过是复杂些的“横渡大洋”问题:)),也难以真正提升程序的效率。相比之下,这本书在Amazon拿到五星,确实不难理解。

如今多核已是大势所趋,有兴趣的朋友,不妨都来读读这本“高年级研究生教材”。

扫描二维码,订阅我的公共号“余晟以为”。