核心有自己的执行单元和加载/存储缓冲区(额外的“缓存” - 除 L1 之外)。
这些执行单元有自己的寄存器吗?内核也有自己的专用寄存器吗?还是所有内核(及其执行单元)都共享 CPU 寄存器?或者我们有共享寄存器,而其他一些寄存器是内核专用的?
是否可以在一个核心上的一个刻度内执行多个 CPU 机器指令(但核心的执行单元不同 - 在超线程模式下也可以并行执行)?
每个核心是否真的都有自己的 (专用) FPU 和 ALU 作为执行单元?我以为 CPU 只有一个 FPU(无论核心数量多少)。
答案1
直接回答现代 x86 CPU 确实超标量并且能够每时钟周期获取、调度和执行多条指令。
举一个稍微极端的例子,现代 i7 6950X 核心显然能够每时钟周期 10.6 条指令(每个核心)执行 Dhrystone MIPS 基准测试时,很可能是由于核心内部和周围的指令融合和其他智能功能使其比简单的 1:1 指令流更高效。
CPU 的前端处理指令解码并将 uOP(分解甚至融合的指令)传递给执行引擎,然后执行引擎将指令路由和分派到能够处理不同指令类型的各个单元。
在一个SkylakeCPU 中有多个单元能够执行整数算术和逻辑(INT ALU)以及矢量处理和 FP 数学。 理论上指令可以可以同时发送到每个单元执行,但一般来说,一次可以发送的 uOP 数量和发送到哪些单元是有限制的。
还存在指令具有不同时间并且并非所有处理单元都同时可用的问题。
至于寄存器,CPU 可以在内部重新映射和替换程序使用的寄存器,以更好地适应实际执行单元。在下图中,您可以看到 Skylake 有 300 多个寄存器;180 个整数寄存器和 168 个矢量寄存器。这些将根据需要使用。
维基芯片是了解 CPU 架构的绝佳去处。下图显示了 Skylake CPU 核心中的功能块。
您不能在一个时钟周期内将两个指令发送到同一个端口,但指令可以按端口排队或分配给另一个端口执行,只要它能够执行该指令类型。