在整理Intel的多种HT超线程技术之前,我们先来回顾一下MultiThreading多线程技术的分类,MultiThreading多线程就是在一个单个的处理核心内同时运行多个工作线程的技术,和CMP(Chip MultiProcessing,芯片多处理)不同,后者是通过集成多个处理内核的方式来让系统的处理能力提升——也就是现在常见的多核技术。现在主流的处理器都使用了CMP技术。
然而CMP技术大规模增加了相应的电路,从而增加了成本,MT(MultiThreading)技术却不是这样,它只需要增加规模很少的部分线路(通常,约2%)就可以提升处理器的总体处理器能力,从而可以很简单地提升相关应用的性能。
MultiThreading(或作Multi-Threading)来源于可以追溯到上个世纪90年代开始的一个叫做ILP(Instruction Level Parallelism,指令级并行化)的思想,这个思想产生了一个叫做Throughput Computing(吞吐量计算)的名词,用来提升如在线交易这样的并行计算的性能。Throughput Computing的两种主要方式就是MultiProcessing和MultiThreading。
一开始,为了开发ILP,在过去的几十年中利用了超标量(Superscalar,同时具备多个执行器)、乱序执行(Out-Of-Order Execute,允许无数据关联性的指令同时运行)、动态分支预测、VLIW(Very Long Instruction Word,超长指令集 ) 等技术(前三种可在经典的Pentium Pro架构上看到,最后一个就是Itanium的特色技术)。然而,超标量使设计的复杂性急剧增加,同时,指令之间的数据和控制相关,可以开发的ILP 也有限,以及一些其它因素,使得经典的超标量结构处理器难以进一步提高处理器性能。
而且从应用的角度看,如在线事务处理OLTP、决策支持系统DSS、Web服务等这样的应用的特点是具有丰富的线程级并行性(Thread Level Parallelism)而缺乏ILP,因此也就促使了MultiProcessing和MultiThreading的出现。
MultiThreading多线程技术的思想有些类似于早期的分时共享计算系统,执行多个线程的处理器在遇到某个线程由于Cache Miss或者分支预测失败而停顿的时候,可以切换到另一个线程来执行。目前主流的MultiThreading具有着三种形式,差别在于线程间共享的资源以及线程切换的机制:
多线程架构异同 | |||||
多线程技术 | 线程间共享资源 | 线程切换机制 | 资源利用率 | ||
粗粒度多线程 Coarse-Grained MultiThreading | 除取指令缓冲、寄存器、控制逻辑外 | 流水线停顿时 | 提升单个执行单元利用率 | ||
细粒度多线程 Fine-Grained MultiThreading | 除寄存器、控制逻辑外 | 每时钟周期 | 提升单个执行单元利用率 | ||
同步多线程 Simultaneous MultiThreading | 除取指令缓冲、返回地址堆栈、寄存器、控制逻辑、重排序缓冲、Store队列外 | 所有线程同时活动,无切换 | 提升多个执行单元利用率 |
其中CMT和FMT都是在单个执行单元下的技术,不同的线程在指令级别上并不是真正的“并行”,而SMT则具有多个执行单元,同一时间内可以同时执行多个指令,因此前两者有时先归类为TMT(Temporal MultiThreading,时间多线程),以和SMT相区分。