是的,CPU 在单个线程中发现指令级并行性,每个周期运行超过 1 条指令。具体示例见Why does re-initializing a register inside an unrolled ADD loop make it run faster even with more instructions inside the loop?。
指令级并行性与线程级并行性无关(您在问题的第二部分提出)。运行单线程工作负载时,只有一个内核处于活动状态。
现代多核系统同时利用这两者,但你可以只拥有一个而没有另一个。
例如,Sun 的Niagara (UltraSPARC T1) 从一开始就设计为利用线程级并行性(和内存级并行性),但不尝试快速运行任何单个线程,例如某种服务器工作负载。它有 8 个物理 single-issue in-order cores 和 4 路 SMT(每个物理内核 4 个逻辑内核)而不是 OoO exec 来隐藏延迟(例如缓存未命中)。单线程性能很糟糕,但运行 32 个线程的最大吞吐量在 2005 年是不错的,因为它的功率预算和晶体管数量。
早期的 x86(如 Pentium III)是超标量单核。只有多socket 系统是 SMP。但是这样的 CPU 可以并且确实实现了 CPI
您的 i5 第 4 代 CPU 是 Haswell。 请参阅David Kanter's deep dive on Haswell's microarchitecture,包括每个内核内部各个阶段的宽度框图。
处理器是否在多核单线程程序中运行?
NO,单核本身就是超标量,例如在 Haswell 或 Zen 中有 4 个整数 ALU 执行单元。 (在 Intel CPU 上,3 个 SIMD ALU 执行单元与标量/通用整数 ALU 在相同的执行端口上。)和一个足够宽以匹配的前端。
一般来说,超标量 CPU 能够在每个时钟每个内核运行至少 2 条指令。
您问题中的这个错误猜测是 programmers.SE 上 How does a single thread run on multiple cores? 的重复。 回答:他们没有;每个核心都有一个宽广的前端和后端的多个执行单元。
在我们实现单核更宽的收益递减之前,我们一直这样做而不是构建多核 CPU;时间切片/先发制人的多任务处理通常已经足够好了。对于几乎所有事情,一个更快的内核都比 N 个 1/N 速度的内核要好。但是现在这不是权衡。它是 N 个 1/sqrt(N) 速度的核心或类似的东西。
- 添加 %eax, (%eax)
- 添加 %ebx, (%ebx)
这些内存目标添加指令每个需要超过 1 个周期才能完成(并且在现代 Intel 上每条指令至少解码 2 微指令:加载+添加微融合和存储(微融合存储地址 + 存储数据). 如果加载+添加部分运行在同一个物理内核上,则它们都可以在同一个周期中启动。
Ice Lake 也可以在同一周期内执行两个存储,但在此之前现代 x86 CPU 每个时钟只执行 1 个存储。 (例如,从 Haswell 到 Coffee Lake 的 Intel 可以在每个时钟周期进行 2 次加载 + 1 次存储。SnB/IvB 可以为每个周期进行 2 次内存操作的地址生成,并且如果其中最多有一个是存储,则可以维持吞吐量。使用256 位向量的特殊 2+1 情况,为 2 个数据周期重用相同的地址生成。)
除非 EAX 和 EBX 持有相同的指针值,否则这些指令访问不同的内存和不同的寄存器,并且除了执行单元(加载、添加、存储)的资源冲突之外是完全独立的。 (寄存器重命名处理 FLAGS 输出的写后写风险)。