在传统CPU中,线程的切换包含一系列的开销,频繁的切换会极大影响系统的性能,为了减少线程切换过程中的开销,便诞生了硬件多线程,在支持硬件多线程的CPU中,必须为每个线程提供单独的通用寄存器组,单独的程序计数器,线程的切换只需要激活选中的寄存器,从而省略了于存储器交换数据的环节,大大减少了线程切换的开销。
硬件多线程 | 细粒度多线程 | 粗粒度多线程 | 同时多线程(SMT) |
指令发射 | 各个时钟周期,轮流发射多个线程的指令 | 连续几个时钟周期,都发射同一线程的指令序列,流水线阻塞时,切换另一个线程 | 一个时钟周期内,同时发射多个线程的指令 |
线程切换频率 | 每个时钟周期切换一次线程 | 只有流水线阻塞时才切换一次线程 | NULL |
线程切换代价 | 低 | 高,需要重载流水线 | NULL |
并行性 | 指令级并行,线程间不并行 | 指令级并行,线程间不并行 | 指令级并行,线程级并行 |
1.细粒度多线程
时钟 | CPU |
i | 发射线程A的指令j, j+1 |
i+1 | 发射线程B的指令k、k+1 |
i+2 | 发射线程A的指令i+2、j+3 |
i+3 | 发射线程B的指令k+2、k+3 |
2.粗力度多线程
时钟 | CPU |
i | 发射线程A的指令i、i+1 |
i+1 | 发射线程 A的指令j+2、j+3发现Cache miss |
i+2 | 线程调度,从A切换到B |
i+3 | 发射线程B的指令k、k+1 |
i+4 | 发射线程B的指令k+2、k+3 |
3.同时多线程
时钟 | CPU |
i | 发射线程A的指令j、j+1,线程B的指令k、k+1 |
i+1 | 发射线程A的指令i+2,线程B的指令k+2,线程C的指令m |
i+2 | 发射线程A的指令i+3,线程C的指令m+1、m+2 |