在测量英特尔第四代i5的CPI(每条指令的周期)时,我们得出的CPI <1。
一些同学建议这是由于代码的并行执行,但是它是用C语言编写的单线程代码,老师说当今的处理器是超标量的。
编译是用gcc -m32完成的。
假设编译器没有通过并行化代码来发挥作用。
但是我的疑问仍然存在。由于当今的处理器对代码做了一点魔术,所以说乱序执行和推测性执行,我想知道是否:
处理器是否在多个核心单线程程序中运行?
可以说我们有以下两条指令:
(1)addl%eax,(%eax)(1)addl%ebx,(%ebx)
Core-0运行(1),Core-1运行(2)
是的,CPU在单个线程中发现指令级并行性,以便每个周期运行1条以上的指令。请参阅为什么在展开的ADD循环中重新初始化寄存器,即使在循环中包含更多指令的情况下,其运行速度也更快?举一个具体的例子。
指令级并行与线程级并行无关(在问题的第二部分提出)。运行单线程工作负载时,只有一个核心处于活动状态。
现代多核系统同时利用了两者,但是您可以拥有一个而没有另一个。
例如,Sun的Niagara(UltraSPARC T1)完全是为了利用线程级并行性(和内存级并行性)而设计的,而不是像某些服务器工作负载那样尝试快速运行任何单个线程。它具有8个物理单问题有序内核和4路SMT(每个物理内核4个逻辑内核),而不是OoO执行程序来隐藏延迟(例如,高速缓存未命中)。单线程性能很糟糕,但是运行32个线程的最大吞吐量对于其2005年的功率预算和晶体管数量来说是好的。
像奔腾III一样,早期的x86是超标量单核。只有多插槽系统才是SMP。但是,此类CPU可以且确实达到CPI <1。
您的i5第四代CPU是Haswell。 请参阅David Kanter对Haswell的微体系结构的深入研究,其中包括每个核心内部各个阶段的宽度框图。
处理器是否在多个核心单线程程序中运行?
不,单个内核本身就是超标量的,例如,在Haswell或Zen中具有4个整数ALU执行单元。(在Intel CPU上,3个SIMD ALU执行单元与标量/通用整数ALU 位于相同的执行端口上。)前端宽度足够匹配。
通常,超标量CPU 每个内核每个时钟能够运行至少2条指令。
您的问题中的这个错误猜测与“单个线程如何在多个内核上运行”重复出现。关于程序员 答:他们没有;每个核心都有一个广泛的前端,在后端具有多个执行单元。
在我们扩大单核的收益递减之前,我们一直这样做,而不是构建多核CPU。时间分片/抢占式多任务通常足够好。在几乎所有方面,一个更快的内核要好于1 / N速度的N个内核。但是,如今这不是折衷的选择。它是N个1 / sqrt(N)速度的内核。
地址%eax,(%eax)
地址%ebx(%ebx)
这些内存目标加法指令每个完成一个周期以上(并在现代Intel上每个解码至少2 ups:加载+添加微融合,然后存储(微融合存储地址+存储数据)。如果它们在相同的物理内核上运行,则加载+添加部件都可以在同一周期中启动。
Ice Lake也可以在同一周期执行两个存储,但是在此之前,现代x86 CPU每个时钟仅执行1个存储。(例如,从Haswell到Coffee Lake的Intel可以在每个时钟周期执行2次加载+ 1个存储。SnB/ IvB可以在每个周期进行2次内存操作的地址生成,并且如果其中一个存储多达一个,则可以维持吞吐量。 256位向量的特殊2 + 1情况,在2个数据周期内重复使用相同的地址生成。)
除非EAX和EBX拥有相同的指针值,否则这些指令将访问不同的内存和不同的寄存器,并且它们是完全独立的,除了执行单元(加载,添加,存储)的资源冲突。(寄存器重命名处理了FLAGS输出的写后写危险)。