有什么迹象表明非数据缓存未命中(指令,TLB等)?

时间:2013-11-26 11:04:14

标签: caching memory-management tlb

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

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

  2. 同样,找到分支错误预测的一种方法是查看是否打破程序通常会将其停在特定跳转附近,然后查看代码以查看跳转是否可预测。

    < / LI>

    (或者,至少,试图找到这样的瓶颈。如果我正在寻找错误的症状让我知道..)

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

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

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

1 个答案:

答案 0 :(得分:1)

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

说完了,如果你坚持使用它,你可以

  1. 检查断点附近的加载/存储地址中的页面偏移量(4k / 2M / ..,具体取决于您的系统配置)。访问流中的小偏移可能表示TLB未命中和页面行走
  2. 使用LBR检查最后一个分支行为和可预测性
  3. 无法想出一种识别I-Cache未命中的方法,因为它们甚至更早,并且与执行流水线进一步分离,在那里调试器可能会捕获“当前”指令