所以我正在学习计算机体系结构,我们必须考虑不同的处理器及其时钟,我不禁觉得在计算平均CPI时我的计算是错误的。对于一个这样的过程,我得到了:
- 指令计数为 1.0E9
- 编译器 A 程序的执行时间为 1.5 秒
- 处理器的时钟速率为 8.0E9 Hz。
我重新设计的方程是CPI = (Execution Time * Clock Rate)/Instruction Count
.
插入这些值,我得到编译器 A 程序的平均 CPI 为 12。但是,这比其他练习题要高得多。我想知道我的计算是否正确,如果是这样,为什么CPI如此之高?
如果这是真实的而不是虚构的随机示例:
我预计 8GHz CPU 会被大量流水线化,因此对分支错误预测和其他停滞会受到高额处罚。 对于更复杂的指令,延迟可能更高。 (大概仍然是add
和其他简单ALU指令的单周期延迟;时钟如此之高以至于你不能这样做,只有在你想要8GHz用于营销而不是实际性能时才有意义。
此外,对于给定速度的 DRAM,缓存未命中具有基本固定的时间(以纳秒为单位(。 使用更快的内核时钟,等待相同的缓存未命中所花费的核心周期要多得多(即,无序执行尝试隐藏的内存延迟更多(。
参见 现代微处理器 90分钟指南!- 这将是一个完整的"速度恶魔"设计,与"布莱尼亚克"相反。
但即便如此,CPI 为 12 在任何理智的设计中可能也不是典型的(例如 SPECint2017(,任何人都会费心构建。 但请记住,这是针对一个特定的程序。 非常高的CPI(低IPC(也是软件效率低下的标志(或者至少做一些不可避免的缓慢的事情(,例如花费大量时间浏览缓存中遗漏的链表。 下一次加载的地址取决于上一次加载,因此它甚至无法启动,直到它从某个外部缓存甚至从内存中到达。
(其他数据结构也涉及指针追逐,例如二叉树。 搜索一个巨大的二叉树涉及指针追逐和(通常(分支错误预测。 二叉搜索平面数组或节点位于已知阵列位置的隐式树,允许软件在下一步之前预取 2 种可能性,使用额外的带宽通过利用大多数硬件能够实现的内存级并行性来减少延迟。
或者当然,由于这只是一个理论示例,没有理智的含义,因此CPU可以像我们想要的那样愚蠢地低效:也许它是微编码的(而不是流水线的(,就像原始的8086和那个时代的其他微处理器一样,并通过遵循微编码步骤来执行指令,每个步骤都需要一个时钟周期。 (例如,Z80的性能细节在内部状态与时钟周期方面是已知的,正常的指令需要几个(。
或者,也许它是一个具有老式 Cray 样式 SIMD 矢量指令的架构,其中一条指令(带有几个指针输入(可能会取代浮点数数组的整个循环。 (因此,高端 CPU 可以利用更宽的数据路径,而无需像 x86 SSE/AVX/AVX512 这样的现代短矢量 SIMD 那样需要不同的机器代码,以利用具有更宽的 SIMD 加/多/FMA 单元的新硬件。