并发与并行(译)

本文来自:https://mp.weixin.qq.com/s/vbnfN2TzhQC2Aa_wJ61RBQ

本文来源:

Bryant R E, O'Hallaron D R. Computer Systems: A Programmer's Perspective(3rd edition)[M]. Pearson Education Limited, 2016.Bryant R E, O'Hallaron D R. Computer Systems: A Programmer's Perspective(3rd edition)[M]. Pearson Education Limited, 2016.

纵观数字计算机的发展历史,有两个需求一直是驱动其进步的持续动力:一个是希望计算机做得更多,另一个是希望计算机运行得更快。当处理器同时执行更多操作时,这两个因素都会得到改善。术语“并发”是一个通用的概念,指一个同时具有多个活动的系统,而术语“并行”指的是用并发使一个系统运行得更快。并行可以在计算机系统的多个抽象层次上发挥作用,下面我们按照系统层次结构从高到低三个层次依次介绍。

 

1.线程级并发

在进程抽象的基础上,我们能够设计多个程序同时执行的系统,从而导致进程的并发。使用线程,我们甚至可以在一个进程中执行多个控制流。自20世纪60年代初分时技术出现以来,计算机系统就开始支持并发执行。传统意义上,这种并发执行只是在一台计算机上通过快速切换多个可执行进程来模拟,就像玩杂耍的人让多个球在空中飞舞一样。这种形式的并发允许多个用户同时与系统交互,就像许多人希望从单个Web服务器获取页面时一样。它还允许单个用户同时执行多个任务,例如在一个窗口中有一个Web浏览器,在另一个窗口中有一个字处理器,以及同时播放流媒体音乐。以前,大多数实际计算都是由单处理器完成的,即使该处理器必须在多个任务之间切换。这种配置的计算机系统称为单处理器系统

当我们构造一个由多处理器组成的系统,其所有的处理器都在一个操作系统内核的控制下,我们就有了一个多处理器系统。自20世纪80年代以来,此类系统用于大规模计算,随着多核处理器超线程的出现,这种系统才变得越来越普遍。图1.16所示不同处理器类型的分类。

并发与并行(译)

多核处理器将几个CPU(称为“核”)集成到一个集成电路芯片上。图1.17说明了典型多核处理器的结构,其中芯片有四个CPU核,每个CPU核都有自己的一级和二级缓存,每个一级缓存分成两部分,一部分用来保存最近获取的指令,另一部分用来保存数据。这些核共享更高级别的缓存以及与内存的接口。业内专家预测,他们能够将几十个,最终数百个核集成在单芯片上。

并发与并行(译)

超线程,有时称为同时多线程(simultaneous multi-threading),是一种允许单个CPU执行多个控制流的技术。它包括一些CPU硬件的多个副本,例如程序计数器和寄存器文件,而硬件的其他部分(例如执行浮点运算的单元)只有一个副本。在不同的线程之间切换在常规处理器中需要大约20000个时钟周期,而超线程处理器则在一个时钟周期的基础上决定执行哪个线程。它使CPU能够更好地利用其处理资源。例如,如果一个线程必须等待一些数据加载到缓存中,那么CPU可以继续执行另一个线程。例如,英特尔酷睿i7处理器可以让每个核执行两个线程,因此一个四核系统实际上可以并行执行八个线程。

使用多处理可以从两个方面提高系统性能。首先,它减少了执行多个任务时模拟并发性的需要。如前所述,即使是一个人使用个人计算机也能同时执行许多活动。其次,它可以更快地运行单个应用程序,但前提是该程序是用能够有效并行执行的多线程编写的。因此,虽然并发原理的形成和研究已超过50年,但多核和超线程系统的出现大大增加了编写利用这些硬件实现线程级并行执行的应用程序的愿望。第12章将更深入地探讨并发,利用并发提供处理资源共享和在程序执行中允许更多并行的方法。

2.指令级并行

在较低的抽象级别上,现代处理器可以同时执行多条指令,这一特性称为指令级并行。例如,早期的微处理器,比如1978年的英特尔8086,需要多个(通常是3-10个)时钟周期执行一条指令。较新的处理器可以保持每个时钟周期执行2到4条指令的速率。其实,任何已知的指令从开始执行到完成都需要更长的时间,可能需要20个时钟周期或更长,但是处理器使用了非常多的聪明的技巧能同时处理多达100条指令。在第4章中,我们将探讨流水线的使用,其中执行指令所需的操作被划分为不同的步骤,处理器硬件被组织为一系列的阶段,每个阶段执行其中的一个步骤。这些阶段可以并行操作,在不同指令的不同部分工作。我们将看到一个相当简单的硬件设计可以维持接近每周期一条指令的执行速率。

能够保持执行速度超过每周期一条指令的处理器称为超标量处理器。大多数现代处理器都支持超标量运算。在第5章中,我们将描述这种处理器的一个高级模型。我们将看到应用程序员可以使用这个模型来诠释他们程序的性能。然后他们可以编写程序,使生成的代码达到更高的指令级并行,使得运行速度更快。

3.单指令、多数据(SIMD)并行

在最底层,许多现代处理器都有特殊的硬件,允许一条指令并行执行多个操作,这种模式称为单指令多数据(SIMD)并行。例如,Intel和AMD最近几代的处理器就含有可以并行地对8对单精度浮点数(C数据类型float)执行加法的指令。

提供这些SIMD指令主要是为了在应用程序中加速处理图像、声音和视频数据。尽管有些编译器试图从C程序中自动提取可用SIMD指令解决的并行问题,但更可靠的方法是使用编译器,比如gcc,支持的特殊矢量数据类型编写程序。作为对第5章中关于程序优化的一般性描述的补充,我们在Web Aside opt:simd中描述了这种编程风格。

注:Web Aside opt:simd 为了避免本书体积过大,内容过多,作者在自己的网站中给出很多资料,在书中用这种方式标出,以方便读者查阅。