【问题标题】:Memory hierarchy latency information内存层次延迟信息
【发布时间】:2012-01-28 14:01:03
【问题描述】:

this post的“示例”部分,作者列出了所有内存组件寄存器/L1/L2/RAM的延迟...我的问题是:您如何测量(在线查找)真正的延迟是多少对于任何给定的芯片?比方说

model name  : Intel(R) Core(TM)2 Duo CPU     E4600  @ 2.40GHz
stepping    : 13
cpu MHz     : 1200.000

我也尝试从英特尔手册中挖掘信息,但在我的一生中,这些内容非常庞大,我不知道在哪里可以找到这些信息。

谢谢。

【问题讨论】:

  • CPU 延迟有点棘手 - 指令可以流水线化,因此测量起来有些困难 - gmplib 有一篇论文简要介绍了它。 gmplib.org/~tege/x86-timing.pdf 简而言之,寄存器延迟不是一件简单的事情——你可以“执行”一条指令,它可能看起来已经完成,但在你检索到结果之前,它可能实际上并没有完成执行。智能编译器会非常努力地对指令进行排序以利用这一点。 (寄存器延迟取决于当前 CPU 状态/之前执行的指令)

标签: memory latency


【解决方案1】:

一个简单的google query(“intel cpu 缓存延迟”)揭示了 Intel 的一项有趣研究:Measuring Cache and Memory Latency and CPU to Memory Bandwidth。在本文中,作者使用LMbench 进行测量。

如何进行测量

使用名为“lat_mem_rd”的可执行二进制文件 在实用程序目录的“bin”文件夹中找到。接下来,使用以下 命令行:

taskset 0x1 ./lat_mem_rd –N [x] –P [y] [depth] [stride]

其中 [x] 等于进程在报告之前运行的次数 潜伏。通常将此设置为“1”就足以进行精确测量。 对于“-P”选项,[y] 等于调用以运行 基准。对此的建议始终为“1”。 仅使用一个处理核心或线程来测量访问延迟。这 [深度] 规范指示实用程序将测量的内存深度。 为了确保准确的测量,请指定一个金额 远远超出缓存,因此它不考虑延迟 测量。

了解结果

由于 L1 和 L2 缓存延迟与核心时钟相关,因此 CPU 频率在 快速内存访问是实时发生的。这意味着核心的数量 时钟保持不变,与核心频率无关。对于一个可比的 结果,最好将 LMBench 给出的延迟从纳秒转换 进入 CPU 时钟。为此,请将延迟乘以处理器频率。

Time(seconds) * Frequency(Hz) = Clocks of latency

因此,如果 2.4 GHz 处理器需要 17 ns 才能访问某个级别的 缓存,这将转换为:

17 x 10-18 seconds * 2400000000 Hz = 17 ns * 2.4 GHz ≈ 41 Clocks

【讨论】:

    【解决方案2】:

    要进行测量,您需要尽早在裸机上进行,因为您不希望受到任何干扰(即时钟频率变化、总线争用等)。

    您将不得不编写一点汇编代码...在 x86 上,步骤如下:

    • 执行序列化指令
    • 读取时间戳计数器
    • 执行序列化指令
    • 进行内存读取
    • 执行序列化指令
    • 再次读取时间戳计数器
    • 执行序列化指令
    • 算一算

    完成后,您只需开始规划和使用缓存即可。请记住,缓存大小和架构在这里发挥着重要作用,因此您需要根据相关主题调整测量值。此外,您可能希望使用预取来使填充更容易。

    【讨论】:

      【解决方案3】:

      一种快速解决方案,您可以根据自己的需要进行破解: http://code.google.com/p/mem-latency/

      它通过加载不同大小的链表来测量延迟。

      【讨论】:

        猜你喜欢
        • 2014-11-15
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 2012-02-22
        • 2019-04-21
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        相关资源
        最近更新 更多