【发布时间】:2013-12-11 11:47:38
【问题描述】:
当您调试性能关键代码并查看反汇编代码时,不难发现由于数据 缓存未命中导致的瓶颈:
-
加载/存储指令往往是常见的瓶颈,这意味着如果您停止程序,它很可能会在从某个不可预测的内存地址加载加载/存储指令时停止。
-
同样,查找分支错误预测的一种方法是查看中断程序是否通常会在特定跳转附近停止它,然后查看代码以查看跳转是否可预测。
(或者,至少,这就是我试图找到这些瓶颈的方式。如果我正在寻找错误的症状,请告诉我..)
但是,其他种缓存未命中的症状是什么?
我确实知道它们很罕见,但我仍然想知道当它们出现时如何发现它们。
“其他”缓存是指:
- 指令缓存
- 翻译后备缓冲区
- 我应该知道但我不知道的其他重要缓存的奖励积分
【问题讨论】:
-
符号是您在分析器输出中看到的数字。由任何可以读回处理器实现的性能计数器的体面分析器支持。请避免列出问题,只需谷歌“英特尔处理器性能计数器”。
-
@HansPassant:很好,但是当我没有针对当前语言的分析器时,有没有办法做到这一点?我之前提到的数据缓存的症状不需要分析器——它们只需要随机暂停程序几次。他们也并不总是需要反汇编程序——只要查看任何语言的源代码中的当前行,不难看出由于指针加载或难以预测的分支而可能出现的瓶颈。我们可以对其他类型的瓶颈做同样的事情吗?
-
这些计数器与语言没有任何关系,它们严格遵守机器代码的执行。这当然是通用的。尝试从“暂停程序几次”中收集个人资料信息完全没有意义,这只是浪费时间。使用适当的工具。
-
@HansPassant:关于语言,我的意思是,并非每种语言的 IDE 都有一个方便的分析器,也不是每个开发环境都有一个方便的 IDE。当然,如果我在安装了 VS Ultimate 的本地计算机上,我将使用性能计数器。但是,当我在另一台机器上运行更平庸的东西时——暂停程序很容易,但启动并运行分析器却不是。我所描述的是一种合法的瓶颈发现技术(基本上是手动采样),这不是我凭空捏造的。问题是如何为指令缓存做到这一点。
-
@HansPassant:为了记录,这里只是一个示例,向您展示“暂停程序几次”是一种完全合法的技术:stackoverflow.com/a/18217639并不是每个人都像通用调试器,并不是所有的东西都像在分析器中那样容易看到,就像手动采样一样。
标签: caching memory-management tlb