1

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

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

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

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

然而,其他类型的缓存未命中的症状是什么?
确实知道它们很少见,但我仍然想知道如果/当它们出现时如何发现它们。

通过“其他”缓存,我的意思是:

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

1 回答 1

1

啊,好古老的穷人剖析技术。如果我说我不时不使用它,那我是在撒谎,但它确实是非常有问题的,并且可能会偏向于寻找heisenbugs而不一定反映真实的行为。另一个问题是指令在现代无序 CPU 上重叠,因此即使程序需要更长的时间来执行某些加载或存储,您的实际断点可能会远离它(实际上早在长延迟加载指令之前)提交,或者在存储指令之后很久。

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

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

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

于 2013-11-26T21:05:52.280 回答