考虑以下循环:
.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克)。
:在任何
由于按需加载未命中而导致的页大小
在大多数的步伐中
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收回次数,但我认为这不是一个相关的因素。
循环展开的影响
LFENCE公司
在循环中展开零次或多次,以更好地了解推测性无序执行对事件计数的影响。下图显示了结果。当循环展开0-63次(在一次迭代中为1-64个添加/加载指令对)时,每一行表示一个特定的加载步幅。每页的y轴都是标准化的。访问的页面数与次要页面错误数相同。
LFENCE公司
我们可以得出以下结论:
-
当加载跨距小于128字节时,
和
小姐引起散步
收敛到3或5并且
收敛到3或4。
-
只有当展开度恰好为零(即,每次迭代有一个加载)时,似乎才起作用。没有
,结果(如上所述)为5
和4
步行4公里
每页事件数。与
,它们都变成每页3个。对于较大的展开度,事件计数平均逐渐增加。当展开度至少为1时(即,每次迭代至少有两个载荷),
LFENCE公司
基本上没有区别。这意味着上面的两个新图对于没有
LFENCE公司
LFENCE公司
.
-
LFENCE公司
LFENCE公司
. 无论如何,执行时间
LFENCE公司