Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 非数据缓存未命中(指令、TLB等)的迹象是什么?_Caching_Memory Management_Tlb - Fatal编程技术网

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

Caching 非数据缓存未命中(指令、TLB等)的迹象是什么?,caching,memory-management,tlb,Caching,Memory Management,Tlb,在调试性能关键型代码并查看反汇编时,不难发现由于数据缓存未命中而导致的瓶颈: 加载/存储指令往往是常见的瓶颈,这意味着,如果停止程序,它很可能会在从某个不可预测的内存地址加载的加载/存储指令附近停止 类似地,查找分支预测失误的一种方法是查看中断程序是否通常会在特定跳转附近停止,然后查看代码以查看跳转是否可预测 (或者,至少,这就是我试图找到这些瓶颈的方式。如果我在寻找错误的症状,请让我知道。) 但是,其他类型的缓存未命中的症状是什么? 我确实知道它们很稀有,但我仍然想知道如果它们出现时如何发现它

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

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

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

  • (或者,至少,这就是我试图找到这些瓶颈的方式。如果我在寻找错误的症状,请让我知道。)

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

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

  • 指令缓存
  • 翻译查找缓冲区
  • 其他我应该知道但我不知道的重要缓存的加分

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

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

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

  • 无法找到识别I-Cache未命中的方法,因为它们甚至更早,并且与执行管道进一步解耦,调试器可能会在执行管道中捕获“当前”指令

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

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

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

  • 无法找到识别I-Cache未命中的方法,因为它们甚至更早,并且与执行管道进一步解耦,调试器可能会在执行管道中捕获“当前”指令

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