【问题标题】:Determine whether memory location is in CPU cache判断内存位置是否在 CPU 缓存中
【发布时间】:2010-10-15 13:03:45
【问题描述】:

操作系统可以确定内存页是在 DRAM 中还是在交换中;例如,只需尝试访问它,如果发生页面错误,则不会。

但是,CPU 缓存是否可以实现相同的功能?

是否有任何有效的方法来判断给定的内存位置是否已加载到缓存行中,或者知道它何时加载?

【问题讨论】:

    标签: memory assembly caching cpu fault


    【解决方案1】:

    X86 不知道如何判断地址是否在缓存中 但是这里是如何判断地址是否在缓存中

    rdtsc
    save timestamp
    mov eax,address
    rdtsc read timestamp counter
    calculate timestamp difference
    if < threshold then was in cache
    

    阈值必须根据文档或经验确定

    有些机器有缓存命中/未命中计数器,同样可以很好地服务

    【讨论】:

      【解决方案2】:

      如果您尝试自己确定这一点,那么运行程序的行为可能会使相关的缓存行无效,从而使您的测量无用。

      这是反映科学原理的情况之一,即您无法在不影响您正在测量的东西的情况下测量某物。

      【讨论】:

      • 嗯,很容易验证一个位置在缓存中。只需从中读取,瞧,它将在缓存中。 ;) 诀窍在于测试缓存中是否not。 :)
      • 如果您确保您的代码从不可缓存的内存中运行,那么仅仅运行程序的行为不会影响缓存。
      • 好点。所以基本上我必须考虑可能发生的所有其他事情,以便知道缓存未命中是否加载了相关内存。
      【解决方案3】:

      总的来说,我认为这是不可能的。它适用于 DRAM 和页面文件,因为这是操作系统管理的资源,缓存由 CPU 本身管理。

      操作系统可以对内存读取进行严格的计时循环,并尝试查看它是否以足够快的速度完成以进入缓存,或者它是否必须输出到主内存 - 这很容易出错。

      在多核/多进程系统上,处理器之间使用cache coherency protocols 来确定何时需要使彼此的缓存无效,我想您可以有一个自定义设备来监听此协议操作系统会查询。

      你想做什么?如果您想强制将某些内容放入内存,当前的 x86 处理器支持以非阻塞方式将内存预取到缓存中,例如在 Visual C++ 中,您可以使用 _mm_prefetch 将一行读取到缓存中。

      编辑: 我自己没有这样做,所以使用风险自负。要确定用于分析的缓存未命中,您可以使用一些特定于体系结构的寄存器。 http://download.intel.com/design/processor/manuals/253669.pdf,附录 A 给出了“性能调整事件”。这不能用于确定单个地址是否在缓存中或何时加载到缓存中,但可用于整体统计信息。我相信这就是 vTune(此级别的出色分析器)使用的。

      【讨论】:

      • 谢谢。我很感兴趣,因为我正在玩弄编写内核。我对在实际硬件上分析缓存行未命中感兴趣。直到看到 Herb Sutter 的幻灯片,我才意识到它们对现代 CPU 的危害有多大:is.gd/oWwp
      • 很多现代 CPU 都有性能计数器,可以提供各种信息,包括缓存相关的统计信息。
      • 现在听起来很有趣。你有参考吗?
      • 哇,有很多,很有趣:msdn.microsoft.com/en-us/library/bb385772.aspx
      • @mike.amy - 我添加了一个指向 Intel IA-32 手册的链接,该手册应该详细说明性能事件。
      猜你喜欢
      • 2010-09-17
      • 2021-12-31
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 2010-12-26
      • 2011-11-02
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多