1 交错/临时多线程
(1)粗粒度多线程:
在一个线程运行到被一个通常会造成长延迟停顿的事件阻塞时,就会发生最简单类型的多线程。这种停滞可能必须访问片外存储器来弥补高速缓存的缺失,数据返回可能需要数百个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。
从概念上讲,它类似于实时操作系统中使用的协作多任务,在这种情况下,当任务需要等待某种类型的事件时自动放弃执行时间。这种类型的多线程被称为块多线程、协作多线程或粗粒度多线程。
(2)交错多线程
交错多线程的目的是从执行通道中移除所有数据的依赖性。由于一个线程相对独立于其他线程,因此一个流水线级中的一条指令需要流水线中旧指令输出的可能性较小。从概念上讲,它类似于操作系统中使用的抢占式多任务处理;作为一个类比,交错多线程给每个活动线程的时间片是一个CPU周期。
例如:
周期i + 1:从线程B发出一条指令。
周期i + 2:从线程C发出一条指令。
这种类型的多线程首先被称为桶处理,其中桶的支柱代表流水线阶段及其执行线程。交错、抢先、细粒度或分时多线程是更现代的术语。
2 同步多线程
最先进的多线程类型适用于超标量处理器。普通超标量处理器在每个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,术语“临时多线程”用来表示一次只能从一个线程发出指令的时间。
除了讨论交错多线程的硬件成本之外,SMT还需要在每个流水线阶段跟踪每个正在处理的指令的线程ID的额外开销。同样,共享资源(如缓存和转换后备缓冲器)的大小必须适合正在处理的大量活动线程。