:“CPU单核一次只能完成一条指令的执行”

2023-08-07 19:33   geyange.com

单但每条都要长!

超标量的CPU单个时钟周期可以完成(retire或者说commit)多条指令,这个取决于该CPU的width是多少。有个前提是CPU必须是顺序commit指令,所以大部分情况下往往达不到最大commit数量的。比如当Reorder Buffer里面最早的那条指令到retire stage了,但是后面那一条还没(还在执行或者cache miss了),这时候就只能commit第一条,尽管第三条第四条指令都是retire的状态,CPU也不能去commit它们,否则有可能破坏program order。

如果题主换过来想,假设只能一个周期commit一条指令的话,那么那些CPU是如何达到超过1的IPC(Instructions Per Cycle)的呢?

希望这些有帮助~

---------------------------------- 4/18/16 关于超标量和SMT的补充 -------------------------------------

@大冬

鉴于问题比较长,我就放到这里来回答你了。

1.

IPC大于1时,这同时完成的多条指令是来自同一个线程,还是可能来自多个线程?我的理解是:线程切换的时候,流水线处于空闲状态,这是线程切换的代价。因此即便单核能达到4个IPC,那这4个指令应该是来自同一线程。

能不能多线程同时commit指令取决于该CPU是否支持SMT (Simultaneous Multi-Threading, SMT)。 据我所知酷睿系列的CPU是支持Hyper-Threading (SMT的Intel官方说法) 的。

首先,CPU执行一个线程需要维持该线程的状态,因此需要一些额外的硬件资源,比如说返回地址栈 (Return Address Stack, RAS)、程序计数器 (Program Counter)、Rename Map Table/Architecture Map Table (这两个不知道中文名是什么…) 等等。然而普通超标量CPU这些资源都只有一套,这就是为什么这些CPU只能从同一个线程里面获得指令。

那么普通CPU是怎么处理线程切换的呢?

我们都知道线程的上下文切换在执行过程中是通过中断来支持的。当CPU碰到中断指令时,它意识到操作系统想要切换线程了,这时它就把这个中断指令先放一放,等当前线程的所有正在执行的指令执行完。等流水线清空完之后,CPU才开始处理上下文切换,并且从新的线程那边开始取指令。

在94~95年时候,Dean Tullsen (UCSD教授,那时候他应该还在UW读博) 等人想到:既然超标量CPU有那么多执行单元,而且貌似单个线程没法充分利用这些单元,何不如让多个线程共享呢?然后SMT就诞生了。

SMT的原理就是在超标量CPU里把线程相关的资源都复制多份 (对于Register File等也可以增加容量),然后让CPU同时从多个线程取指并执行。由于线程之间没有dependency (关联性), 这些来自不同线程的指令就独立的进入流水线执行并commit。SMT的CPU不仅仅利用了普通超标量CPU的Instruction-Level Parallelism (ILP,指令间并行) ,而且还利用了Thread-Level Parallelism (TLP,线程间并行)。

所以这就是为什么SMT能够同时commit来自不同线程的指令。

2.

假设CPU的流水线是15级,那么每一条指令从发射到retire,都会依次经过15级的步骤吗?有没有某些指令不需要15个步骤提前结束或跳过某些中间步骤?我的理解是:应该是这样,否则就无法解释单核单线程CPU的IPC大于1了。因为流水线毕竟是串行的。

这里题主忽略了一个事实:超标量CPU的执行单元有多个。如下是一个4-way超标量CPU的流水线的简单示意图。

(图片来自NCSU Dr. Eric Rotenberg的

ECE 721

Advanced Microarchitecture课件,侵删)

这里我们发现超标量CPU不仅流水线比in-order CPU级数多,而且每级流水线有多个单元。确实题主说的不同指令可能经过的流水线级数可能不一样,比如在execution stage,浮点型运算指令就会比整数运算指令多执行很多级 (因为浮点型运算单元非常庞大,如果不对它们更进一步的流水线处理的话,时钟周期会变得非常长,继而影响CPU速度)。

但是这不是超标量CPU能同时commit多条指令的关键。

超标量之所以能够commit多条指令在于它能同时从Instruction Cache (指令缓存) 中取多条指令。这就保证了同个时钟周期有多条指令进入流水线。比如说上图的CPU,它的取指单元 (Fetch) 能够一个周期取4条指令 (属于同一个线程)。

并且由于超标量CPU每级流水线都有多个单元,假设理想状态下,取得的这些指令相互之间没有关联性时,它们就可以批量的在流水线中推进,最后批量commit。

3.

即便是intel酷睿的超线程CPU,也是多个发射单元共享一个执行单元,所以多线程在微指令层面上,也是交替执行的吧?

相信在1和2中已经回答了题主的这个问题。

Reference

1. D.M. Tullsen, S.J. Eggers, J.S. Emer, H.M. Levy, J.L. Lo, and R.L. Stamm, "Exploiting Choice: Instruction Fetch and Issue on an Implementable Simultaneous Multithreading Processor," In 23rd Annual International Symposium on Computer Architecture, May, 1996

2. Eric Rotenberg, "ECE 721 Advanced Microarchitecture",

https://courses.ncsu.edu/ece721/lec/001/


文章版权声明:除非注明,否则均为格言阁原创文章,转载或复制请以超链接形式并注明出处。
取消