- 在实现IPL指令级并行的同时实现TLP(Thread Level Parallelism)线程级并行
- 实现多线程有两种主要的方法
- 超线程即同时多线程,在单个处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件
- 当两个线程同时需要某个资源时,其中一个线程必须挂起
- 超线程技术本身与操作系统无关,但某些操作系统可能对超线程的支持程度有所不同
- 超线程技术最初是由英特尔公司开发的,后来被其他处理器制造商(如AMD)采用。在Windows操作系统中,超线程技术可以通过主板芯片组的驱动程序进行支持。在Linux操作系统中,超线程技术可以通过内核补丁进行支持。
细粒度(Fine-grained)多线程
粗粒度(Coarse-grained)多线程
- 一个超标量处理器在4种情况下的资源使用情况
- 超线程技术也被叫作同时多线程(Simultaneous Multi-Threading,SMT)技术。是一种在多流出、动态调度的处理器上同时开发线程级并行和指令级并行的技术
- 一个线程就是一个指令序列,多线程就是多个指令序列
- 解决细粒度调度方式会对单个线程的性能产生不利的影响
- 线程是进程内的一个相对独立且可独立调度和指派的执行单元,它比进程要“轻巧”得多。 只拥有在运行过程中必不可少的一点资源,如:程序计数器、一组寄存器、堆栈等。线程切换时,只需保存和设置少量寄存器的内容,开销很小。 线程切换只需要几个时钟周期。 进程的切换一般需要成百上千个处理器时钟周期
- 超线程的CPU,其实是把一个物理层面 CPU 核心,“伪装”成两个逻辑层面的 CPU 核心。这个 CPU,会在硬件上加电路,使得我们可以在一个 CPU 核心内部,维护两个不同线程的指令的状态信息
- 一个物理 CPU 核心内部,会有双份的 PC 寄存器、指令寄存器乃至条件码寄存器。这样,这个 CPU 核心就可以维护两条并行的指令的状态。在外面看起来,似乎有两个逻辑层面的 CPU 在同时运行
- 在 CPU 的其他功能组件上,Intel 可不会提供双份。无论是指令译码器还是 ALU,一个 CPU 核心仍然只有一份。因为超线程并不是真的去同时运行两个指令,那就真的变成物理多核了。超线程的目的,是在一个线程 A 的指令,在流水线里停顿的时候,让另外一个线程去执行指令。因为这个时候,CPU 的译码器和 ALU 就空出来了,那么另外一个线程 B,就可以拿来干自己需要的事情。这个线程 B 可没有对于线程 A 里面指令的关联和依赖
- 这样,CPU 通过很小的代价,就能实现“同时”运行多个线程的效果。通常我们只要在 CPU 核心的添加 10% 左右的逻辑功能,增加可以忽略不计的晶体管数量
- 我们并没有增加真的功能单元。CPU计算并没有跑满,往往是因为当前的指令要停顿在流水线上,等待内存里面的数据返回。一般是在那些各个线程“等待”时间比较长的应用场景下。比如,我们需要应对很多请求的数据库应用,就很适合使用超线程。各个指令都要等待访问内存数据,但是并不需要做太多计算(适合IO密集型作业)