0

所以我正在学习计算机体系结构,我们必须考虑不同的处理器及其时钟,我不禁觉得在计算平均 CPI 时我的计算是错误的。对于一个这样的过程,我得到:

  • 指令计数为 1.0E9
  • 编译器 A 的程序执行时间为 1.5s
  • 处理器的时钟频率为 8.0E9 Hz。

我修改后的方程是CPI = (Execution Time * Clock Rate)/Instruction Count

插入这些值,我得到编译器 A 程序的平均 CPI 为 12。但是,这比其他练习题要高得多。我想知道我的计算是否正确,如果正确,为什么CPI这么高?

4

1 回答 1

1

如果这是真实的,而不是虚构的随机示例:

我预计 8GHz CPU 会被大量流水线化,因此会对分支错误预测和其他停顿造成高额惩罚。对于更复杂的指令,可能会有更高的延迟。(大概仍然是单周期延迟add和其他简单的 ALU 指令;时钟如此之高以至于您无法做到这一点,只有在您想要 8GHz 用于营销而不是实际性能时才有意义。)

此外,对于给定的 DRAM 速度,高速缓存未命中具有基本固定的时间(以纳秒为单位)。使用更快的核心时钟,等待相同的高速缓存未命中(即试图隐藏乱序执行的更多内存延迟)会花费更多的核心周期。

另请参阅现代微处理器 90 分钟指南!- 这将是一个完整的“速度恶魔”设计,与“brainiac”相反。


但即便如此,对于任何人都会费心构建的任何理智的设计,12 的 CPI 可能都不是典型的(例如对于 SPECint2017)。但请记住,这是针对一个特定程序的。非常高的 CPI(低 IPC)也是软件效率低下的标志(或者至少做一些不可避免的慢的事情),例如花费大量时间遍历缓存中未命中的链表。下一次加载的地址取决于前一次加载,因此它甚至无法启动,直到它从某个外部缓存到达,甚至从内存中一路到达。

(其他数据结构也涉及指针追踪,例如二叉树。搜索巨大的二叉树涉及指针追踪和(通常)分支错误预测。二进制搜索平面数组或节点位于已知数组位置的隐式树,允许在下一步之前对两种可能性进行软件预取,使用额外的带宽通过利用大多数硬件能够实现的内存级并行性来减少延迟。)


或者当然,因为这只是一个理论上的例子,没有任何理智的暗示,CPU 可以像我们想要的那样愚蠢地低效:也许它是微编码的(而不是流水线的),就像那个时代的原始 8086 和其他微处理器一样,并执行指令遵循每个需要一个时钟周期的微编码步骤。(例如,Z80 的性能细节在内部状态与时钟周期方面是已知的,正常指令需要几个)。


或者,它可能是一种带有老式 Cray 风格的 SIMD 矢量指令的架构,其中一条指令(带有一对指针输入)可能会替换浮点数数组上的整个循环。(因此,高端 CPU 可以利用更宽的数据路径,而无需像 x86 SSE/AVX/AVX512 等现代短向量 SIMD 那样需要不同的机器代码,从而利用具有更宽 SIMD 添加/多/FMA 单元的新硬件.)

于 2020-02-11T05:57:07.870 回答