CS149 の 笔记


并行计算。>>> 传送门 <<<

Lecture 1: Why Parallelism

很早以前实现并行的性价比并不高,因为人们只需要等最新的 CPU 出来就行。厂商通过以下两种方式提升 CPU 性能:

  1. 提升时钟频率;
  2. 实现指令级别的并行(ILP, Instruction Level Parallelism);

然而时钟频率因为 energy wall 达到瓶颈,ILP 也受限于指令流的设计,我们迫切地需要其他手段来提升程序执行效率,所以需要我们编写代码提高性能。

所谓并行(Parallelism),其实可以理解为,在原来单个时钟周期内执行单条指令处理单个数据的基础上,实现多个处理器/线程进行合作,从而更快地解决问题。在 CPU 性能一定的情况下,并行能最大化利用 CPU,提升程序执行效率。

Lecture 2: A Modern Multi-Core Processor

并行执行

目前有以下几种并行执行的方式:

超标量(Superscalar)

一个时钟周期内执行多条 independent 的指令(其实就是 ILP)。所谓 independent,就是指指令之间不 load/store 同一内存地址/寄存器里的数据。像下面这两条指令就是不 independent 的。

ILP 的实现需要在一个 CPU core 内包含多个 Data Fetch/Instruction Decode 模块。

多核(Multi-core)

多核确实能提高执行效率,如果不与其他策略配合使用,只会是堆砌成本的下下策,依然没有改变单核效率低下的问题。

单个指令处理多个数据(SIMD, Single Instruction Multiple Data)

通过向量的方式进行数据处理。

SIMD 的实现需要在一个 CPU core 内包含多个 ALU 模块。配合多核能够实现一条指令处理 #core * #ALU 个数据

然而,遇到条件指令(if)时,因为所有 ALU 共享 Decode 模块,所以会出现某些 ALU 不满足条件而无法利用的情况,导致并不能达到 peak performance。最好能进行数据层面的优化,使得同一组 ALU 处理的数据能够满足同一条件。

其他瓶颈

时延(latency)

当遇到 load/store 等访问内存的指令时,因为数据传输需要时间,称为 Stall,只有当数据到达 CPU 后才指令才能继续运行。

解决方案

  1. 通过多级 Cache 来加快数据获取;
  2. 通过 Interleaving Multi-thread,当某一线程 Stall 时,由操作系统进行线程切换(调度),将 CPU 资源分给另一线程,从而提高 CPU 利用率; > 整体的效率提升了,但单个任务的效率会因为等待调度减慢。同时需要一些存储空间来存储每个线程的上下文。

带宽(bandwidth)

CPU 依靠总线(bus)单位时间内最多可以从内存中获取的数据量。一旦某次计算所需数据量过大,带宽也将成为限制。

解决方案

减少数据从内存读取的次数,比如用 Cache。

Lecture 3: Parallel Programming Abstractions

Abstractions vs implementation

Three models of communication


  目录