非数据缓存未命中的迹象是什么(指令、TLB等)



当您调试性能关键代码并查看反汇编时,不难发现由于数据缓存未命中而导致的瓶颈:

  1. 加载/存储指令往往是常见的瓶颈,这意味着如果你停止程序,它很可能会在接近从某个不可预测的内存地址加载加载/存储的指令时停止。

  2. 类似地,查找分支预测失误的一种方法是查看中断程序是否通常会在特定的跳跃附近停止,然后查看代码,查看跳跃是否可预测。

(或者,至少,这就是试图找到这种瓶颈的方式。如果我在寻找错误的症状,请告诉我。)

然而,其他类型的缓存未命中的症状是什么
我知道它们很罕见,但我仍然想知道如何在它们出现时发现它们。

所谓"其他"缓存,我指的是:

  1. 指令缓存
  2. 翻译Lookaside缓冲区
  3. 我应该知道但我不知道的其他重要缓存的奖励积分

啊,老好人的剖析器技术。如果我说我没有经常使用它,那我就是在撒谎,但它确实有很大的问题,可能会偏向于寻找黑森博格,而不一定反映真实的行为。另一个问题是指令在现代乱序CPU上重叠,因此即使程序需要更长的时间来进行加载或存储,您的实际断点也可能远离它(早在长延迟加载指令真正提交之前,或者早在存储指令提交之后

话虽如此,如果你坚持使用它,你可以

  1. 检查断点附近的加载/存储地址中的页面偏移量(4k/2M/..取决于您的系统配置)。访问流中的一个小偏移可能表示TLB未命中和页面遍历
  2. 使用LBR检查最后一个分支的行为和可预测性

想不出识别I-Cache未命中的方法,因为它们甚至更早,并且与调试器可能捕获"当前"指令的执行管道进一步解耦

最新更新