代码之家  ›  专栏  ›  技术社区  ›  Hadi Brais

什么原因导致DTLB加载未命中。发生WALK性能事件?

  •  2
  • Hadi Brais  · 技术社区  · 7 年前

    考虑以下循环:

    .loop:
        add     rsi, STRIDE    
        mov     eax, dword [rsi]
        dec     ebp
        jg .loop
    

    哪里 STRIDE rsi 包含指向在 bss 章节。这个循环是代码中唯一的循环。也就是说,循环之前没有初始化或接触它。在Linux上,缓冲区的所有4K虚拟页都将按需映射到同一物理页。

    哈斯韦尔演出活动

    :未命中所有TLB级别 导致任何页面大小的页面漫游。

    DTLB U LOAD U MISSES.WALK U COMPLETED U完成4公里 :根据需要完成的页面漫游 加载未命中导致任何TLB级别的4K页行走。

    DTLB U LOAD U MISSES.WALK U COMPLETED U 2米U 4米 :由于 按需加载未命中,导致在任何TLB级别上都有2米/4米的页行走。

    DTLB U LOAD U MISSES.WALK U COMPLETED U 1G(DTLB U装载未命中。行走已完成) :所有TLB级别的加载未命中导致 完成的页面漫游。(1克)。

    :在任何 由于按需加载未命中而导致的页大小

    enter image description here

    在大多数的步伐中 MISS_CAUSES_A_WALK 事件每访问一页发生5次,并且 WALK_COMPLETED_4K WALK_COMPLETED 怎么会有4个已完成的页面行走和一个明显已取消的行走? 注意Haswell上有一个单页的walker(与Broadwell上的两个相比)。

    我意识到有一个TLB预取器似乎只能预取下一页 thread . 根据该线程,预取器的遍历似乎不被计算为 小姐引起散步 事件,我同意。

    这似乎是导致这些高事件计数的两个原因:(1)页错误导致指令被重新执行,从而导致同一页的第二次页遍历;(2)TLB中丢失的多个并发访问。 否则,通过使用 MAP_POPULATE 并添加 LFENCE 加载指令之后的指令,1 小姐引起散步 事件和一 步行4公里 事件发生 每页 . 没有 LFENCE公司 ,每页的计数稍大一点。

    LFENCE公司 指令,我得到两个 小姐引起散步 事件和两个 事件 . 没有 ,每次访问的计数稍大一点。

    我还尝试过使用预取指令,而不是循环中的按需加载。页面错误情况的结果与无效内存位置情况相同(这是有意义的,因为在这两种情况下预取都失败):1 小姐引起散步 事件和一 步行4公里 事件 每次预取 . 否则,如果预取是到具有有效内存转换的位置,则 小姐引起散步 事件和一 步行4公里 每页 . 没有 LFENCE公司

    所有的实验都在同一个核上进行。在该核心上发生的TLB射击中断次数几乎为零,因此它们不会对结果产生影响。我找不到一个简单的方法来测量操作系统在内核上的TLB收回次数,但我认为这不是一个相关的因素。


    enter image description here


    循环展开的影响

    LFENCE公司 在循环中展开零次或多次,以更好地了解推测性无序执行对事件计数的影响。下图显示了结果。当循环展开0-63次(在一次迭代中为1-64个添加/加载指令对)时,每一行表示一个特定的加载步幅。每页的y轴都是标准化的。访问的页面数与次要页面错误数相同。

    enter image description here

    enter image description here

    LFENCE公司

    我们可以得出以下结论:

    • 当加载跨距小于128字节时, 小姐引起散步 收敛到3或5并且 收敛到3或4。
    • 只有当展开度恰好为零(即,每次迭代有一个加载)时,似乎才起作用。没有 ,结果(如上所述)为5 和4 步行4公里 每页事件数。与 ,它们都变成每页3个。对于较大的展开度,事件计数平均逐渐增加。当展开度至少为1时(即,每次迭代至少有两个载荷), LFENCE公司 基本上没有区别。这意味着上面的两个新图对于没有 LFENCE公司 LFENCE公司 .
    • LFENCE公司 LFENCE公司 . 无论如何,执行时间 LFENCE公司
    0 回复  |  直到 6 年前