写点什么

何去何从的并行计算

  • 2022 年 8 月 24 日
    北京
  • 本文字数:3763 字

    阅读完需:约 12 分钟

也许你正试图将你的应用改造成并行模式运行,也许你只是单纯地对并行程序感兴趣。

无论出于何种原因,你正对并行计算充满好奇、疑问和求知欲。

不过首先,要公布一条令人沮丧的消息。

就在大伙儿都认为并行计算必然成为未来的大趋势时,2014 年年底,在 Avoiding ping pong 论坛上,伟大的 Linus Torvalds 提出了一个截然不同的观点,他说:“忘掉那该死的并行吧!”(原文:Give it up. The whole "parallel computing is the future" is a bunch of crock.)

我们到底该如何选择呢?


01

忘掉那该死的并行

Linus Torvalds 是一个传奇式的人物(图 1),是他给出了 Linux 的原型,并一直致力于推广和发展 Linux 系统。

1991 年,他首先在网络上发布了 Linux 源码,从此 Linux 迅速崛起壮大,成为目前使用最广泛的操作系统之一。



图 1 传奇的 Linus Torvalds

自 2002 年起,Linus 就决定使用 BitKeeper 作为 Linux 内核开发的版本控制工具,以此来维护 Linux 的内核源码。

BitKeeper 是一套分布式版本控制软件,它是一套商用系统,由 BitMover 公司开发。

2005 年,BitKeeper 宣称:发现 Linux 内核开发人员试图使用逆向工程来解析 BitKeeper 内部协议,因此,决定向 Linus 收回 BitKeeper 授权。

虽然 Linux 核心团队与 BitMover 公司进行了协商,但是仍无法解决他们之间的分歧。

因此,Linus 决定自行研发版本控制工具来代替 BitKeeper。于是,Git 诞生了。

如果你正在使用 Git,那么我相信你一定会为 Git 的魅力所折服;如果你还没有了解过 Git,那么我强烈建议你关注一下这款优秀的产品。

而正是这位传奇人物,给目前红红火火的并行计算泼了一大盆冷水。那么,并行计算究竟应该何去何从呢?

Linus 在发言中这么说道:

Where the hell do you envision that those magical parallel algorithms would be used?

The only place where parallelism matters is in graphics or on the server side, where we already largely have it. Pushing it anywhere else is just pointless.

So the whole argument that people should parallelize their code is fundamentally flawed. It rests on incorrect assumptions. It's a fad that has been going on too long.

(需要有多么奇葩的想象力才能想象出并行计算的用武之地?

并行计算只能在图像处理和服务端程序两个领域使用,并且它在这两个领域已经有了大量广泛的使用。但是在其他任何地方,并行计算毫无建树!

因此,人们争论是否应该将代码并行化是一个本质上的错误。这完全基于一个错误的假设。“并行”是一个早该结束的时髦用语。)

看了这段较为完整的表述,大家应该对 Linus 的观点有所感触,我对此也表示赞同。

与串行程序不同,并行程序的设计和实现异常复杂,其复杂性不仅体现在程序的功能分离上,多线程间的协调性、乱序性都会成为程序得以正确执行的障碍。

只要你稍不留神,就会“失之毫厘,谬以千里”!

混乱的程序难以阅读、难以理解,更难以调试。

所谓“并行”,也就是把简单问题复杂化的典型。

因此,只有“疯子”才会叫嚣“并行就是未来”(The crazies talking about scaling to hundreds of cores are just that – crazy)。

但是,Linus 也提出了两个特例,那就是图像处理和服务端程序是可以、也需要使用并行技术的。

仔细想想,为什么图像处理和服务端程序是特例呢?

和用户终端程序不同,图像处理往往拥有极大的计算量。一张 1024 像素×768 像素的图片,包含多达 78 万 6 千多个像素。即使将所有的像素遍历一遍,也得花不少时间。

更何况,图像处理涉及大量的矩阵计算,矩阵的规模和数量都会非常大。

因为如此密集的计算,很有可能超过单核 CPU 的计算能力,所以自然需要引入多核计算了。

而服务端程序与一般的用户终端程序相比,一方面,服务端程序需要承受很大的用户访问压力。根据淘宝的数据,它在“双 11”一天,支付宝核心数据库集群就处理了 41 亿个事务、执行了 285 亿次 SQL、生成了 15TB 日志、访问了 1931 亿次内存数据块且发生了 13 亿个物理读。如此密集的访问,恐怕任何一台单核计算机都难以承受,因此,并行程序也就自然成了唯一的选择。

另一方面,服务端程序往往会比用户终端程序拥有更复杂的业务模型。面对复杂业务模型,并行程序会比串行程序更容易适应业务需求、模拟我们的现实世界。毕竟,我们的世界本质上是并行的。比如,当你开开心心去上学的时候,妈妈可能在家里忙着家务,爸爸在外打工赚钱,一家人其乐融融。如果有一天,你需要使用你的计算机来模拟这个场景,你会怎么做呢?如果你在一个线程里,既做了你自己,又做了妈妈,又做了爸爸,显然这不是一种好的解决方案。但如果你使用三个线程,分别模拟这三个人,一切看起来那么自然,而且容易被人理解。

再举一个专业点的例子,比如基础平台 Java 虚拟机,虚拟机除了要执行 main 函数外,还需要做 JIT 编译和垃圾回收。无论是 main 函数、JIT 编译还是垃圾回收,在虚拟机内部都是一个单独的线程。

是什么使得虚拟机的研发人员这么做的呢?

显然,这是因为建模的需要。因为这里的每一项任务都是相对独立的。我们不应该将没有关联的业务代码拼凑在一起,分离为不同的线程更容易理解和维护。因此,使用并行也不完全是出于对性能的考虑,有时候我们会很自然地那么做。


02

可怕的现实:摩尔定律的失效

摩尔定律是由 Intel 创始人之一戈登·摩尔提出来的,其内容为:集成电路上可容纳的电晶体(晶体管)数目,约每隔 24 个月便会增加一倍。经常被引用的“18 个月”,是由 Intel 首席执行官大卫·豪斯所说“预计 18 个月会将芯片的性能提高一倍(即更多的晶体管使其更快)”而来的。

说得直白点,就是每 18 个月到 24 个月,我们的计算机性能就能翻一番。

反过来说,就是每过 18 个月到 24 个月,你用一半的价钱就能买到和现在性能相同的计算设备了。这听起来是一件多么激动人心的事情呀!

但是,摩尔定律并不是一种自然法则或者物理定律,它只是基于人为观测数据对未来的预测。

按照这种速度,我们的计算能力将会按照指数速度增长,用不了多久,我们的计算能力就能超越“上帝”了!畅想未来,基于强劲的超级计算机,我们甚至可以模拟整个宇宙。

摩尔定律的有效性已经超过半个世纪了,然而,在 2004 年,Intel 宣布将 4GHz 芯片的发布时间推迟到 2005 年。在 2004 年秋季,Intel 宣布彻底取消 4GHz 计划(图 2)。



图 2 Intel CEO Barret 单膝下跪对取消 4GHz 感到抱歉

是什么迫使世界顶级的科技巨头放弃 4GHz 的研发呢?

显然,就目前的硅电路而言,很有可能已经走到了头。我们的制造工艺已经精确到纳米了。1 纳米是 10-9 米,也就是十亿分之一米。这已经是一个相当小的数字了。

就目前的科技水平而言,如果无法在物质分子层面以下进行工作,那么也许 4GHz 的芯片就已经接近理论极限了。因为即使一个水分子,它的直径也有 0.4 纳米。

当然,如果我们使用完全不同的计算理论或者芯片生成工艺,也许会有本质的突破,但目前我们还没有看到这种技术被大规模使用的可能性。

因此,摩尔定律在 CPU 的计算性能上可能已经失效。虽然,现在 Intel 已经研制出了 4GHz 芯片,但可以看到,在近 10 年的发展中,CPU 主频的提升已经明显遇到了一些暂时不可逾越的瓶颈。


03

柳暗花明:不断地前进

虽然 CPU 的性能已经几近止步,长达半个世纪的摩尔定律轰然倒地,但是这依然没有阻挡科学家和工程师们带领我们不断向前的脚步。

从 2005 年开始,我们已经不再追求单核的计算速度,而是着迷于研究如何将多个独立的计算单元整合到单独的 CPU 中,也就是我们所说的多核 CPU。

短短十几年的发展,家用型 CPU,比如 Intel i7 就可以拥有 4 核,甚至 8 核。而专业服务器则通常可以配有几个独立的 CPU,每个 CPU 都拥有多达 8 个甚至更多的内核。从整体上看,专业服务器的内核总数甚至可以达到几百个。

非常令人激动的是,摩尔定律在另外一个侧面又生效了。

根据这个定律,我们可以预测,每过 18 个月到 24 个月,CPU 的内核数就会翻一番。用不了多久,拥有几十甚至上百个 CPU 内核的芯片就能进入千家万户。

顶级计算机科学家唐纳德·尔文·克努斯(Donald Ervin Knuth)如此评价这种情况:“在我看来,这种现象(并发)或多或少是由硬件设计者已经无计可施导致的,他们将摩尔定律失效的责任推给软件开发者。”

唐纳德(图 3)是计算机巨著《计算机程序设计艺术》的作者。《美国科学家》杂志曾将该书与爱因斯坦的《相对论》、狄拉克的《量子力学》和理查·费曼的《量子电动力学》等书并列为 20 世纪最重要的 12 本物理科学类专论书之一。



图 3 唐纳德

04

光明或是黑暗

根据唐纳德的观点,摩尔定律本应该由硬件开发人员维持。但是,很不幸,硬件工程师似乎已经无计可施了。

为了继续保证性能的高速发展,硬件工程师破天荒地想出了将多个 CPU 内核塞进一个 CPU 里的奇妙想法。

由此,并行计算就被非常自然地推广开来,随之而来的问题也层出不穷,程序员的黑暗时期也随之到来。

简化的硬件设计方案必然带来软件设计的复杂性。换句话说,软件工程师正在为硬件工程师无法完成的工作负责,因此,也就有了唐纳德的“他们将摩尔定律失效的责任推给了软件开发者”的说法。

所以,如何让多个 CPU 有效并且正确地工作也就成了一门技术,甚至成了很大的学问。

比如,多线程间如何保证线程安全,如何正确理解线程间的无序性、可见性,如何尽可能地设计并行程序,如何将串行程序改造为并行程序。而对并行计算的研究,就是希望给这片黑暗带来光明。


本文节选自《实战 Java 高并发程序设计(第 3 版)》一书,想了解更多关于并发编程的内容,欢迎阅读此书!



用户头像

还未添加个人签名 2019.10.21 加入

还未添加个人简介

评论

发布
暂无评论
何去何从的并行计算_博文视点Broadview_InfoQ写作社区