The Wayback Machine - https://web.archive.org/web/20221028212104/https://baike.sogou.com/kexue/d10074.htm

多线程

编辑
在单个处理器上运行的具有两个执行线程的进程示意图

在计算机体系结构中,多线程是由操作系统支持的中央处理器(或多核处理器中的单核)同时具有执行多个线程能力的方法。这种方法不同于多处理。在多线程应用程序中,线程共享单个或多个内核的资源,包括计算单元、中央处理器缓存和转换查找缓冲器(TLB)。

当多处理系统在一个或多个内核中包括多个完整的处理单元时,多线程旨在通过使用线程级并行和指令级并行来提高单个内核的利用率。由于这两种技术是互补的,它们有时在具有多个多线程CUP和具有多个多线程内核的CPU系统中结合使用。

1 概述编辑

自20世纪90年代末以来,随着进一步开发指令级并行性的努力陷入停滞,多线程范式变得越来越流行。这使得吞吐量计算的概念重新出现在更专业的数据处理领域。尽管很难进一步加速单个线程或单个程序,但大多数计算机系统实际上是在多线程或程序之间进行多任务处理。因此,提高所有任务吞吐量的技术可以提高计算机的整体性能。

吞吐量计算的两个主要技术是多线程和多处理。

1.1 优势

如果一个线程有很多缓存丢失,其他线程可以继续利用未使用的计算资源,这可能会导致整体进程更快的执行,因为如果只执行一个线程,这些资源就会闲置。此外,如果一个线程不能使用CPU的所有计算资源(因为指令依赖于彼此的运算结果),运行另一个线程可以防止这些资源变得空闲。

1.2 缺点

共享硬件资源(如缓存或转换查找缓冲器)时,多个线程可能会相互干扰。因此,由于适应线程切换的硬件需要较低频率或额外传输途径,甚至当只有一个线程正在执行时,单个线程的执行时间没有得到改善,甚至执行时间会降低。

总体效率相同,英特尔声称其超线程技术[1] 提高了30%的运算效率,而仅执行非优化相关浮点运算循环的合成程序在并行运行时实际上可以获得100%的速度提升。另一方面,使用MMX或AltiVec扩展和执行数据预取(作为一个优秀的视频编码程序员可能会这样做)的手动汇编语言程序调整不会遭受缓存缺失或空闲计算资源的困扰。但是这样的程序不能从硬件多线程中获益,并且确实会因为共享资源的争用而导致性能下降。

从软件的角度来看,硬件对多线程的支持对软件来说更加明显,与多处理相比,多线程需要对应用程序和操作系统进行更多的更改。用于支持多任务处理的硬件技术通常与用于计算机多任务处理的软件技术并行。线程调度也是多线程中的一个主要问题。

2 多线程的类型编辑

2.1 交错/临时多线程

粗粒度多线程

在一个线程运行到被一个通常会造成长延迟停顿的事件阻塞时,就会发生最简单类型的多线程。这种停滞可能必须访问片外存储器来弥补高速缓存的缺失,数据返回可能需要数百个CPU周期。线程处理器会在不等待停顿解决的情况下执行切换到另一个准备运行的线程。只有当前一个线程的数据到达时,前一个线程才会被放回到准备运行的线程列表中。

例如:

  1. 周期i:线程A发出指令j。
  2. 周期i + 1:线程A发出指令j + 1。
  3. 周期i + 2:线程A发出指令j + 2,这是一个在所有高速缓存中未被执行的加载指令。
  4. 周期i + 3:调用线程调度程序,切换到线程B。
  5. 周期i + 4:线程B发出指令k。
  6. 周期i + 5:线程B发出指令k + 1。

从概念上讲,它类似于实时操作系统中使用的协作多任务,在这种情况下,当任务需要等待某种类型的事件时自动放弃执行时间。这种类型的多线程被称为块多线程、协作多线程或粗粒度多线程。

多线程硬件支持的目标是允许在阻塞的线程和准备运行的另一个线程之间快速切换。为了实现这个目标,硬件的成本是复制程序可见寄存器,以及一些处理器控制寄存器(如程序计数器)。从一个线程切换到另一个线程意味着硬件从使用一个寄存器组切换到另一个寄存器组;为了有效地在活动线程之间切换,每个活动线程都需要有自己的寄存器组。例如,为了在两个线程之间快速切换,寄存器硬件需要实例化两次。

多线程的额外硬件支持线程在一个CPU周期内完成切换,从而带来性能提升。此外,额外的硬件允许每个线程采取与单独执行时同样的方式运行,并且不与其它线程共享任何硬件资源,从而最小化应用程序和操作系统中支持多线程所需的软件更改量。

许多微控制器和嵌入式处理器家族都有多个寄存器组,以允许中断的快速进行上下文切换。这种方案可以被认为是用户程序线程和中断线程之间的一种块多线程。

交错多线程

交错多线程的目的是从执行通道中移除所有数据的依赖性。由于一个线程相对独立于其他线程,因此一个流水线级中的一条指令需要流水线中旧指令输出的可能性较小。从概念上讲,它类似于操作系统中使用的抢占式多任务处理;作为一个类比,交错多线程给每个活动线程的时间片是一个CPU周期。

例如:

  1. 周期i + 1:从线程B发出一条指令。
  2. 周期i + 2:从线程C发出一条指令。

这种类型的多线程首先被称为桶处理,其中桶的支柱代表流水线阶段及其执行线程。交错、抢先、细粒度或分时多线程是更现代的术语。

除了在多线程块类型中讨论的硬件成本之外,交错多线程还需要一个额外的开销,即每个流水线级跟踪它正在处理的指令的线程ID。此外,由于流水线中有更多的线程同时执行,则需要更多的共享资源(如缓存和转换后备缓冲器),以避免在不同线程之间发生抖动。

2.2 同步多线程

最先进的多线程类型适用于超标量处理器。普通超标量处理器在每个CPU周期从一个线程发出多个指令,而在同步多线程(SMT)中,超标量处理器在每个CPU周期可以从多个线程发出指令。认识到任何单个线程的指令级并行性都是有限的,这种类型的多线程试图利用多个线程之间的可用并行性来减少与未使用的问题槽相关联的额外开销。

例如:

  1. 周期i:线程A发出指令j和j + 1以及线程B同时发出的指令k。
  2. 周期i + 1:线程A发出指令j + 2、线程B发出指令k + 1和线程C同时发出指令m。
  3. 周期i + 2:线程A发出指令j + 3和线程C同时发出的指令m + 1和m + 2。

为了区分其他类型的多线程和SMT,术语“临时多线程”用来表示一次只能从一个线程发出指令的时间。

除了讨论交错多线程的硬件成本之外,SMT还需要在每个流水线阶段跟踪每个正在处理的指令的线程ID的额外开销。同样,共享资源(如缓存和转换后备缓冲器)的大小必须适合正在处理的大量活动线程。

同步多线程的实现主要包括DEC(后来的康柏,美国电脑公司Compaq)EV8(未完成)、英特尔intel超线程技术、IBM POWER5、太阳微系统公司(UltraSparc)的T2、克雷XMT、AMD推土机和Zen微体系结构。

3 实现细节编辑

一个主要的研究领域是线程调度器,它必须从准备运行的线程列表中快速选择下一个要执行的线程,并维护准备运行和停止运行的线程列表。一个重要的子主题是调度器可以使用不同的线程优先级方案。线程调度器可以完全用软件、完全用硬件或者作为软硬件结合来实现。

另一个研究领域是什么类型的事件应该引起线程切换:高速缓存丢失、线程间通信、DMA完成等。

如果多线程方案复制了所有软件的可见状态,包括特权控制寄存器和TLb(转换后备缓冲器),那么它可以为每个线程创建虚拟机。这允许每个线程在同一处理器上运行自己的操作系统。另一方面,如果只保存用户模式状态,则需要更少的硬件,这将允许在相同的芯片面积或开销下同时激活更多的线程。

参考文献

  • [1]

    ^"Intel Hyper-Threading Technology, Technical User's Guide" (PDF). p. 13. Archived from the original (PDF) on 2010-08-21..

阅读 6288
版本记录
  • 暂无