多线程

<image>

多执行绪（multithreading），是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支援而能够在同一时间执行多于一个线程，进而提升整体处理效能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理（Chip-level multithreading）或同时多线程（Simultaneous multithreading）处理器。

软件多线程。即便处理器只能运行一个线程，操作系统也可以通过快速的在不同线程之间进行切换，由于时间间隔很小，来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。如微软的Windows作业系统和Linux就是在各个不同的执行绪间来回切换，被称为单人多工作业系统。而DOS这类文字界面作业系统在一个时间只能处理一项工作，被视为单人单工作业系统。

除此之外，许多系统及处理器也支持硬件多线程技术。对称多处理机（SMP）系统具有多个处理器，所以具有真正的同时执行多个线程的能力；CMP技术通过在一块芯片上集成多个核心（Core）也具有真正的多线程能力；CMT技术则稍有不同，有的是依靠硬件执行线程切换来获得多线程能力，操作系统不再负责线程切换，因而这部分开销可以减少甚至消除，这方面典型的例子是Sun的UltraSPARC T1，它同时综合了CMP和CMT。微软的Windows 2000以后的操作系统皆支援多执行绪与超执行绪技术。

## 概观

由于程序代码中存在的数据及控制依赖关系，单线程中所能发掘的指令并行潜力是有限的。为了发掘有限的指令级并行潜力而一味强化乱序执行和分支预测，以至于处理器复杂度和功耗急剧上升，有时候是得不偿失的。因此，现代微处理器多采用硬件多线程技术来发掘线程之间的线程级并行潜力。这样子允许在界面转换的专业领域之运算能力大幅提升：

- 既使这样做对于提升单一程式或是执行绪的效能相当困难，但是目前多数的系统都是使用多工的方式作业。
- 能够明显的提升整体系统运算能力，总体吞吐量获得提升。

有两种提升运算能力的主要技术分别是多进程与多执行绪。

不过有些对多执行绪的批评如下：

- 当共享硬件资源（像是快取或是TLB）时多执行绪会造成干预。
- 单执行绪的执行时间可能不会因为多执行绪而变短。硬件侦测技术有可能改变这一状况。
- 多执行绪的硬件支援会牵涉到软件支援，如此程式与操作系统就需要比多程序化更大幅度的修改。

## 粗粒度交替多线程

### 概念

一个执行绪持续执行，直到该执行绪被一个事件挡住而制造出长时间的延迟(可能是内存load/store操作，或者程序分支操作)。该延迟通常是因快取失败而从核心外的内存读写，而这动作会使用到几百个CPU周期才能将资料回传。与其要等待延迟的时间，执行绪化处理器会切换执行到另一个已就绪的执行绪。只要当之前执行绪中的资料送达后，上一个执行绪就会变成已就绪的执行绪。这种方法来自各个线程的指令交替执行，可以有效的掩盖内存存取时延，填补流水线空洞。

举例来说：

- 周期 i：接收执行绪 A 的指令 j
- 周期 i+1：接收执行绪 A 的指令 j+1
- 周期 i+2：接收执行绪 A 的指令 j+2，而这指令快取失败
- 周期 i+3：执行绪排程器介入，切换到执行绪 B
- 周期 i+4：接收执行绪 B 的指令 k
- 周期 i+5：接收执行绪 B 的指令 k+1

在概念上，它与即时操作系统中使用的合作式多工类似，在该任务需要为一个事件等待一段时间的时候会主动放弃执行时段。

### 硬件成本

此种多执行绪硬件支援的目标，是允许在挡住的执行绪与已就绪的执行绪中快速切换。为了要达成这个目标，硬件成本将复制程式看得见的暂存器与一些处理器控制暂存器（像是程式计算器）。从一个执行绪切换到另一个执行绪对硬件来讲意谓著从一个暂存器复制到另一个。

这些新增功能的硬件有这些优势：

- 执行绪切换能够在一个 CPU 周期内完成(实际上可以没有开销，上个周期在运行线程A，下个周期就已在运行线程B)。
- 这样子看起来像是每个执行绪是独自执行的，没有其他执行绪与目前共享硬件资源。对操作系统来说，通常每个虚拟线程都被视做一个处理器。这样就不需要很大的软件变更（像是特别写支援多执行绪的操作系统）。

为了要在各个现行中的执行绪有效率的切换，每个现行中的执行绪需要有自己的暂存设置（register set）。像是为了能在两个执行绪中快速切换，硬件的暂存器需要两次例示（instantiated）。

### 范例

- 许多微控制器与嵌入式处理器有多重的暂存器列，就能够在中断时快速上下文交换。这样架构可以视为程式的执行绪与中断执行绪之间的块状多执行绪处理。

## 细粒度交替式多线程

### 概念

另一种更高效能的多执行绪做法是将所有 CPU 周期轮流切换至不同的执行绪，来自各线程的指令按顺序交替执行。执行过程很像桶形处理器(Barrel Processor)就像这样：

- 周期 i：接收执行绪 A 的一个指令
- 周期 i+1：接收执行绪 B 的一个指令
- 周期 i+2：接收执行绪 C 的一个指令

这种执行绪的效果是会将所有从执行管线中的资料从属（data dependency）关系移除掉。因为每个执行绪是相对独立，管线中的一个指令阶层需要从已跑完管线中的较旧指令代入输出的机会就相对的变小了。

而在概念上，这种多执行绪与操作系统的核心先占多工（pre-exemptive multitasking）相似。

### 硬件成本

除了讨论块状多执行绪的硬件成本，交错式多执行绪也因每层管线需要追踪执行中指令的执行绪代码而增加硬件成本。而且，当越来越多的执行绪同时在管线中执行，像是快取与 TLB 等共享资源也要加大来避免不同执行绪之间的冲突。

### 范例

- Denelcor Heterogeneous Element 处理器 (HEP)
- Intel Super-threading
- 昇阳 UltraSPARC T1
- Lexra NetVortex
- 搭载 Multi-Threaded ASE 的 MIPS 34K 核心
- Raza Microelectronics Inc XLR

## 同步多执行绪

### 概念

目前最先进的多执行绪技术是应用在超纯量处理器上。超纯量处理器内在每个CPU周期中，单独一个执行绪会释出众多的指令。套用同步多执行绪(SMT)之后，超纯量处理器就可以在每个CPU周期中，从多个执行绪中释出指令。辨识到任何一个单一执行绪拥有有限数量的指令平行处理，这种类型的多执行绪是试着利用并行的方式跨越多执行绪，以减少浪费与闲置的资源。

举例来说：

- 周期 i：执行绪 A 的 j 指令 与 j+1 指令，还有 B 执行绪的指令 k 同时释出
- 周期 i+1：执行绪 A 的 j+2 指令、执行绪 B 的 k+1指令，与执行绪 C 的 m 指令同时释出
- 周期 i+2：执行绪 A 的 j+3 指令，与执行绪 C 的 m+1 与 m+2 指令同时释出

### 硬件成本

交错式多执行绪如果不计硬件成本，SMT在每个管线阶层的追踪执行绪指令会有多余的花费。而且，像是快取与TLB这类共享的资源可能会因为多出来的执行绪而变得更大。

### 范例

- Alpha AXP EV8 (未完成)
- Intel 超执行绪
- IBM Power5
- Cell 微处理器 内的 Power 算子件
- 昇阳 UltraSPARC T2
- 昇阳 Rock微处理器
- AMD Bulldozer

## 实作

在大多数研究领域内是要求执行绪排程器要能够快速选择其中一个已就绪执行绪去执行，而不是一个一个执行而降低效率。所以要让排程器去分辨执行绪的优先级是很重要的。而执行绪排程器可能是以硬件、软件，或是软硬件并存的形式存在。

而另一个研究领域则是要研究何种事件（快取失败、内部执行续连系、使用DMA等）会造成执行绪切换。

如果多执行绪的方案会复制所有软件可见的状态，包括特许的控制登录、TLB 等，那就能够让虚拟机器去创造各式执行绪。这样子就允许在相同的处理器中每个执行绪跑各自的操作系统。换句话说，如果只有储存了使用者模式的状态，就能够让相同的裸晶大小的芯片在一段时间内处理更多的执行绪。