CS61C – 10 – Parallelism (2)

这一部分的内容对应于 lec 33 的相关内容, (b 大上的参考课程为 [Summer 20]),在前面一部分笔记我们提及了并行的相关概念,并就其中颗粒度最细的一种并行方式——数据级并行(SIMD) 做出了初步讨论,而在这一讲中,我们会将视角拉的更远些,从多个指令流——线程的角度出发对并行进行更粗粒度的探索。

Prof.Dan 这次出场是五个 ball,啥时候换小李飞刀(

讲座在思路上是延续之前的思路,即”发现问题” $\rightarrow$ “分析问题” $\rightarrow$ “解决问题”三部曲。

前进,不择手段的前进!

讲座开篇就提出了集中提升性能的方式,除了前文我们提及的超频、指令级并行(ILP,即我们前面提及的流水线设计)和 SIMD 外,此处提及了另一种方式:TLP – 线程级并行。

实现 TLP 的硬件支持是多处理器架构(Multicore Architecture),也就是所谓的多核。它是指一个独立的控制器,拥有自己的控制单元、寄存器文件、ALU和Cache(通常是L1和L2),可以独立执行一个指令流(线程).

对于多核架构而言,一个重要的特征是资源共享。一般来说,所有核心通常共享最后一级缓存(LLC, 如L3 Cache)主内存(DRAM) 和I/O系统。我们将这种所有核心平等地访问共享内存的模型被称为 SMP。它简化了编程(通过共享变量通信),但需要注意的是,共享内存也可能同时成为性能瓶颈。

WAM,我们是不是漏了什么?

前面我们大量提及了一个名词:线程,但似乎并没有对它是什么做出解释。当然如果你学过操作系统,那很容易就知道线程是 CPU 调度的基本单位。与之对应,或者说容易弄混的另一个概念是进程,进程是系统资源分配的基本单位。

当然此处我们不提及进程,只提线程。讲座将线程视为是对并行的一种抽象概括,是拥有一个属于自己的程序计数器和寄存器状态的单一指令序列。

软件线程和硬件线程

事实上,真正决定同时执行指令能力的是硬件线程,一个单核CPU只有一个硬件线程。一个支持超线程的单核 CPU 有两个或以上的硬件线程。

但我们在类似任务管理器中看见的是是软件线程,你可能会惊讶于它的数量之多,因为一个程序可以创建成百上千的线程,但实际上的可用执行数量只取决于硬件线程。

这就不得不提前面提到过的 OS 了, OS 负责将大量的软件线程映射到有限的硬件线程上执行。它通过时间分片(Time Slicing) 和事件触发(如I/O阻塞) 来进行线程切换(Context Switching)

所以为了以少承多,我们需要尽可能地提高硬件资源的利用率,尤其是利用存在的内存延迟(时间周期长)

为此,讲座给出了同时多线程 (SMT / Hyper-Threading) 的支持方案,具体来说,SMT 通过在单个物理核心内复制多份Architectural State(架构状态,即PC和寄存器文件),同时共享大部分执行资源(如ALU、缓存、功能单元),使得单个物理核心对操作系统看起来像是多个逻辑核心。基于此,操作系统可以同时调度两个软件线程到这一个物理核心上。这样就使得当一个线程停顿时另一个线程能够立即使用空闲的执行单元。

一山放出一山拦

在讲座的最后,Prof . DAN 对并行编程面临的挑战和约束做出了评析,借用 Edward Lee 的名言,他指出并行编程的基本问题其实是 非确定性(Nondeterminism):

线程的执行顺序由操作系统调度器决定,是非确定的。这会导致竞态条件(Race Conditions) 等复杂问题,当然我们可用通过同步原语等方式进行规避,不过这是下一讲的内容了。

至于并行编程的性能约束,则来源于Amdahl’s Law,即一个程序的加速比取决于其可并行部分的比例。即使你使用了1000个核心,如果程序中有5%的代码是必须串行执行的,那么理论上的最大加速比也不会超过20倍。这就是为什么共享资源(如内存)可能成为瓶颈。

写在最后

总而言之,这一部分的内容,为我们勾勒出了现代计算环境的全貌:

  • 硬件趋势: 从拼命提高单核频率转向增加核心数量(多核)和提升单个核心的效率(超线程/SIMD)。
  • 软件抽象: 线程是操作系统和程序员利用多核硬件能力的主要抽象工具。
  • 核心机制: 操作系统通过调度将软件线程映射到硬件线程;硬件通过SMT/超线程进一步提高物理核心的利用率。
  • 根本挑战: 编写正确且高效的可扩展并行程序是极其困难的,因为它引入了非确定性,彻底改变了顺序编程的范式。

理解这些概念是学习并行编程、操作系统和体系结构的基础。下一讲(TLP II)我们将会深入探讨如何通过同步(Synchronization) 来应对并行编程的挑战,例如使用锁、信号量等机制来“修剪”非确定性,从而编写出正确的并行程序。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注