Performance 以时钟周期为单位的缓存未命中延迟

Performance 以时钟周期为单位的缓存未命中延迟,performance,cpu-architecture,latency,cpu-cache,perf,Performance,Cpu Architecture,Latency,Cpu Cache,Perf,为了测量程序中缓存未命中的影响,我想将缓存未命中引起的延迟与实际计算使用的周期进行比较。 我使用perf stat测量程序中的循环、L1负载、L1未命中、LLC负载和LLC未命中。以下是一个示例输出: 467 769,70 msec task-clock # 1,000 CPUs utilized 1 234 063 672 432 cycles

为了测量程序中缓存未命中的影响,我想将缓存未命中引起的延迟与实际计算使用的周期进行比较。 我使用
perf stat
测量程序中的循环、L1负载、L1未命中、LLC负载和LLC未命中。以下是一个示例输出:

               467 769,70 msec task-clock                #    1,000 CPUs utilized          
        1 234 063 672 432      cycles                    #    2,638 GHz                      (62,50%)
          572 761 379 098      instructions              #    0,46  insn per cycle           (75,00%)
          129 143 035 219      branches                  #  276,083 M/sec                    (75,00%)
            6 457 141 079      branch-misses             #    5,00% of all branches          (75,00%)
          195 360 583 052      L1-dcache-loads           #  417,643 M/sec                    (75,00%)
           33 224 066 301      L1-dcache-load-misses     #   17,01% of all L1-dcache hits    (75,00%)
           20 620 655 322      LLC-loads                 #   44,083 M/sec                    (50,00%)
            6 030 530 728      LLC-load-misses           #   29,25% of all LL-cache hits     (50,00%)
那么我的问题是: 如何将缓存未命中数转换为“丢失”时钟周期数? 或者,获取数据所花费的时间比例是多少

我认为建造师应该知道这个因素。我的处理器是英特尔酷睿i7-10810U,我在基准测试CPU的nor中找不到这些信息

这描述了如何测量缓存未命中中丢失的周期数,但有没有方法将其作为硬件信息获取?理想情况下,输出类似于:

L1-hit: 3 cycles
L2-hit: 10 cycles
LLC-hit: 30 cycles
RAM: 300 cycles

无序的exec和内存级并行通过将有用的工作与飞行中的时间数据重叠来隐藏一些延迟。如果简单地将L3未命中计数乘以300个周期,则可能超过整个程序所用的周期总数。当没有UOP执行且存在未完成的三级缓存未命中时,性能事件“循环”活动“暂停三级缓存未命中”(存在于我的Skylake CPU上)应计算循环数。i、 e.执行完全停止时的循环。但也会有一些工作循环,但比没有缓存未命中的循环要少,这更难评估

TL:DR:内存访问采用了大量的流水线;整个内核不会因为一次缓存丢失而停止,这就是关键所在。指针跟踪基准测试(用于测量延迟)只是最坏的情况,其中唯一的工作是取消对加载结果的引用。看看哪个有关于记忆和“记忆墙”的部分。另请参阅和,以了解有关无序exec CPU的详细信息,以及它们如何在一条指令等待缓存未命中数据时继续执行独立工作,直至其无序窗口大小的限制。()


回复:供应商编号:

L3和RAM延迟不是固定数量的核心时钟周期:首先,核心频率是可变的(与非核心时钟和内存时钟无关),其次是来自其他核心的争用,以及互连上的跳数。(相关:讨论与L3和内存无关的核心频率的一些影响)

也就是说,英特尔的优化手册中确实包含了一个表,其中列出了L1和L2的精确延迟,以及Skylake服务器上典型的L3和DRAM延迟。(2.2.1.3 Skylake服务器微体系结构缓存建议) -他们说SKX L3延迟通常为50-70个周期。DRAM速度在一定程度上取决于DIMM的定时


其他人已经测试了特定的CPU,比如。

无序执行和内存级并行通过将有用的工作与飞行中的时间数据重叠来隐藏一些延迟。如果简单地将L3未命中计数乘以300个周期,则可能超过整个程序所用的周期总数。当没有UOP执行且存在未完成的三级缓存未命中时,性能事件“循环”活动“暂停三级缓存未命中”(存在于我的Skylake CPU上)应计算循环数。i、 e.执行完全停止时的循环。但也会有一些工作循环,但比没有缓存未命中的循环要少,这更难评估

TL:DR:内存访问采用了大量的流水线;整个内核不会因为一次缓存丢失而停止,这就是关键所在。指针跟踪基准测试(用于测量延迟)只是最坏的情况,其中唯一的工作是取消对加载结果的引用。看看哪个有关于记忆和“记忆墙”的部分。另请参阅和,以了解有关无序exec CPU的详细信息,以及它们如何在一条指令等待缓存未命中数据时继续执行独立工作,直至其无序窗口大小的限制。()


回复:供应商编号:

L3和RAM延迟不是固定数量的核心时钟周期:首先,核心频率是可变的(与非核心时钟和内存时钟无关),其次是来自其他核心的争用,以及互连上的跳数。(相关:讨论与L3和内存无关的核心频率的一些影响)

也就是说,英特尔的优化手册中确实包含了一个表,其中列出了L1和L2的精确延迟,以及Skylake服务器上典型的L3和DRAM延迟。(2.2.1.3 Skylake服务器微体系结构缓存建议) -他们说SKX L3延迟通常为50-70个周期。DRAM速度在一定程度上取决于DIMM的定时


其他人测试过特定的CPU,例如。

非常感谢,英特尔硬件性能事件非常有用(尽管很难使用)。假设所有Skyline处理器都有相同的管道系统,这公平吗?@Vendec:是的,即使在Skylake服务器和-客户端之间,管道的基本架构也是相同的。二级缓存的大小、关联性和延迟有所不同,SKX启用了AVX512,但其他一切都是一样的。非常感谢,“英特尔硬件性能”事件非常有用(尽管很难使用)。假设所有Skyline处理器都有相同的管道系统,这公平吗?@Vendec:是的,即使在Skylake服务器和-客户端之间,管道的基本架构也是相同的。二级缓存的大小、关联性和延迟都不同,SKX启用了AVX512,但其他一切都是一样的。