在“计算机组织与设计:硬件/ David A. Patterson 和 John L. Hennessy 的《Software Interface, Sixth Edition》RISCV Edition 第 6.4 章,其中提到了“粗粒度多线程”:
但是关于“细粒度 多线程”,它不是指切换线程时管道的变化:此更改消除了对线程的需求 切换速度非常快,并且不太可能减慢执行速度 单个线程,因为来自其他线程的指令仅在以下情况下才会发出 线程遇到代价高昂的停顿。
因为粗粒度的处理器 多线程从单个线程发出指令,当发生停顿时, 管道必须清空或冻结。后开始执行的新线程 在指令能够完成之前,必须先填充管道。
这种交错通常是在 循环方式,跳过在该时钟周期“停滞”的任何线程。问: 因为书上说:
线程包括
程序计数器, 寄存器状态,以及 堆栈。时都会开始切换线程,为什么粗粒度多线程必须需要管道而且这两类多线程在遇到
stalls
空,因为管道指令源只是来自单个线程然后填充管道但是“细粒度多线程” “不是吗?
我认为重点是,如果你要拥有两组可以同时处于活动状态的寄存器状态、页表、FP异常状态等,那么你不妨进行细粒度的多线程处理。仅以这种方式进行粗粒度多线程处理的好处是,您不需要
支持
同时在管道中拥有来自不同上下文的指令,从而简化了诸如 FP 异常和舍入模式之类的事情,无需单独进行处理。指导。被换出的线程的体系结构状态可以保存到只能由硬件上下文切换逻辑访问的特殊存储中,而不是一堆东西中的额外标记位,以及具有两倍数量条目的 RAT。
(正如 Bandwidth 博士所评论的,细粒度多线程通常仅用于具有乱序执行和寄存器重命名的 CPU。)
在细粒度多线程中,指令以循环方式从分配给该特定核心的每个线程插入到管道中,如果线程遇到内存停顿,则该时刻的指令不会插入到管道中。 而在粗粒度多线程中,管道仅包含当前正在执行的线程的指令。因此,要在线程之间切换,必须清空管道以填充另一个线程的指令。
我希望这能回答你的问题。