Cache Performance
由于指令计数与硬件无关,因此很容易使用该数字来评估处理器性能。 这种间接的性能衡量方法让许多计算机设计者望而却步。 评估内存层次结构性能的相应模板是专注于未命中率,因为它也与硬件速度无关。 正如我们将看到的,未命中率可能与指令计数一样具有误导性。 内存层次结构性能的更好衡量标准是平均内存访问时间:
其中hit time是在缓存中命中的时间; 我们之前已经看过其他两个术语。 平均访问时间的组成部分可以用绝对时间(例如,命中时 0.25-1.0 ns)或处理器等待内存的时钟周期数来衡量,例如150-200 的未命中惩罚 时钟周期。请记住,平均内存访问时间仍然是性能的间接衡量标准; 尽管它是比未命中率更好的衡量标准,但它不能替代执行时间。
这个公式可以帮助我们在拆分缓存和统一缓存之间做出决定。
Average Memory Access Time and Processor Performance
一个明显的问题是,由于缓存未命中而导致的平均内存访问时间是否可以预测处理器性能。
首先,停顿还有其他原因,例如由于 I/O 设备使用内存引起的争用。 设计人员通常假设所有内存停顿都是由于缓存未命中造成的,因为内存层次结构通常会支配其他停顿原因。 我们在这里使用这个简化的假设,但在计算最终性能时一定要考虑所有内存停顿。
其次,答案还取决于处理器。 如果我们有一个有序执行处理器(见第 3 章),那么答案基本上是肯定的。 处理器在未命中时停顿,并且内存停顿时间与平均内存访问时间密切相关。 现在让我们做这个假设,但我们将在下一小节中回到乱序处理器。
如上一节所述,我们可以将 CPU 时间建模为:
这个公式提出了一个问题,即缓存命中的时钟周期应该被视为 CPU 执行时钟周期的一部分还是内存停顿时钟周期的一部分。 尽管这两种约定都是合理的,但最广泛接受的是在 CPU 执行时钟周期中包含命中时钟周期。
我们现在可以研究缓存对计算性能的影响。
如本示例所示,缓存行为会对性能产生巨大影响。 此外,缓存未命中对具有低 CPI 和快速时钟的处理器具有双重影响:
- CPI 执行越低,固定数量的缓存未命中时钟周期的相对影响就越大。
- 在计算 CPI 时,缓存未命中惩罚是以未命中的处理器时钟周期为单位来衡量的。 因此,即使两台计算机的内存层次结构相同,时钟频率较高的处理器每次未命中的时钟周期数也较多,因此 CPI 的内存部分也较高。
因此,对于具有低 CPI 和高时钟速率的处理器而言,缓存的重要性更大,因此,在评估此类计算机的性能时忽略缓存行为的危险更大。 阿姆达尔定律又来了!
尽管最小化平均内存访问时间是一个合理的目标——我们将在本附录的大部分内容中使用它——但请记住,最终目标是减少处理器执行时间。 下一个示例显示了这两者的不同之处。
Miss Penalty and Out-of-Order Execution Processors
对于乱序执行处理器,如何定义“未命中惩罚”? 它是内存未命中的完整延迟,还是处理器必须停顿时的“暴露”或非重叠延迟? 在数据丢失完成之前停止的处理器中不会出现这个问题。
让我们重新定义内存停顿,以导致未命中惩罚的新定义为非重叠延迟:
类似地,由于一些无序处理器会延长命中时间,因此性能方程的那部分可以除以总命中延迟减去重叠命中延迟。 通过将总未命中延迟分为无争用延迟和由于争用导致的延迟,可以进一步扩展该等式以解决乱序处理器中的内存资源争用问题。 让我们专注于未命中延迟。
我们需要指出以下问题:
内存延迟的长度——在无序处理器中考虑什么作为内存操作的开始和结束。
延迟重叠的长度——处理器重叠的开始是什么(或者,等效地,我们什么时候说内存操作使处理器停顿)?
鉴于乱序执行处理器的复杂性,没有单一的正确定义。
因为在退出流水线阶段只能看到提交的操作,我们说处理器在一个时钟周期内停止,如果它没有退出该周期内的最大可能指令数。 我们将这个停顿归因于第一条无法撤消的指令。 这个定义绝不是万无一失的。 例如,应用优化来改善某个停顿时间可能不会总是改善执行时间,因为现在可能会暴露另一种类型的停顿——隐藏在目标停顿后面。
对于延迟,我们可以从内存指令在指令窗口中排队的时间开始测量,或者地址生成的时间,或者指令实际发送到内存系统的时间。 只要以一致的方式使用,任何选项都有效。
总之,尽管定义和测量乱序处理器的内存停顿的最新技术很复杂,但请注意这些问题,因为它们会显着影响性能。 之所以会出现这种复杂性,是因为无序处理器可以容忍由于缓存未命中而导致的一些延迟,而不会影响性能。 因此,设计人员在评估内存层次结构中的权衡时通常使用乱序处理器和内存的模拟器,以确保有助于平均内存延迟的改进实际上有助于程序性能。
为了帮助总结本节并作为方便的参考,图 B.7 列出了本附录中的缓存方程。