【问题标题】:What are the signs of non-data cache misses (instruction, TLB, etc.)?非数据缓存未命中(指令、TLB 等)的迹象是什么?
【发布时间】:2013-12-11 11:47:38
【问题描述】:

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

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

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

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

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

“其他”缓存是指:

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

【问题讨论】:

  • 符号是您在分析器输出中看到的数字。由任何可以读回处理器实现的性能计数器的体面分析器支持。请避免列出问题,只需谷歌“英特尔处理器性能计数器”。
  • @HansPassant:很好,但是当我没有针对当前语言的分析器时,有没有办法做到这一点?我之前提到的数据缓存的症状不需要分析器——它们只需要随机暂停程序几次。他们也并不总是需要反汇编程序——只要查看任何语言的源代码中的当前行,不难看出由于指针加载或难以预测的分支而可能出现的瓶颈。我们可以对其他类型的瓶颈做同样的事情吗?
  • 这些计数器与语言没有任何关系,它们严格遵守机器代码的执行。这当然是通用的。尝试从“暂停程序几次”中收集个人资料信息完全没有意义,这只是浪费时间。使用适当的工具。
  • @HansPassant:关于语言,我的意思是,并非每种语言的 IDE 都有一个方便的分析器,也不是每个开发环境都有一个方便的 IDE。当然,如果我在安装了 VS Ultimate 的本地计算机上,我将使用性能计数器。但是,当我在另一台机器上运行更平庸的东西时——暂停程序很容易,但启动并运行分析器却不是。我所描述的是一种合法的瓶颈发现技术(基本上是手动采样),这不是我凭空捏造的。问题是如何为指令缓存做到这一点。
  • @HansPassant:为了记录,这里只是一个示例,向您展示“暂停程序几次”是一种完全合法的技术:stackoverflow.com/a/18217639并不是每个人都像通用调试器,并不是所有的东西都像在分析器中那样容易看到,就像手动采样一样。

标签: caching memory-management tlb


【解决方案1】:

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

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

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

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

【讨论】:

  • 啊 #1 是个好点。但是,如果没有专门的工具,#2 可能会有点困难。 +1
猜你喜欢
  • 2012-05-13
  • 2014-04-19
  • 2017-04-05
  • 2017-01-14
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2013-09-04
相关资源
最近更新 更多