几句话说清楚38:什么是 Memory Disambiguation

首先看一下disambiguation这个单词在字典中的意思:

disambiguation
/dɪsamˈbɪɡjʊeɪt/
verb remove uncertainty of meaning from (an ambiguous sentence, phrase, or other linguistic unit).

中文:消除歧义

OK,那么什么叫“Memory消除歧义”呢?其实就是需要搞清楚一个读取操作应该拿到的值到底是多少。

举一个简单的例子:

1
2
store 1, (r2) ; 给r2中内存地址写入值1
load r3, (r4) ; 读取r4中内存地址的值,并写入r3

这里的问题就是,这条load指令是不是要等待第一条store指令执行完之后才可以执行。如果r2r4中保存的内存地址不相同(也不存在overlap),那么这两条指令可以不用关心执行的先后顺序,从而可以通过并行执行的方式提高系统性能。

如果这两个寄存器中的值相同,就很蛋疼,因为必须要保证指令执行的先后顺序,否则load指令会读取一个“有歧义”的值。

CPU中使用了一系列机制来确保在性能最优的情况下处理这个问题。例如store/load buffer,store load forward等。同时也继续延续”speculative”的光荣传统,承担“猜错”的风险获取性能收益。而如果一旦猜错,那么所有load及之后的指令都需要从流水线中清除,十分类似分支预测失败之后的处理。

以上机制的详细内容不在这里深究,下面主要看一下如何探测出你的程序性能是否受到了Memory Disambiguation的影响。

在SKYLAKE的PMU描述文档里存在一个MACHINE_CLEARS.MEMORY_ORDERING的事件,它的描述是:

Counts the number of memory ordering Machine Clears detected. Memory Ordering Machine Clears can result from one of the following:a. memory disambiguation,b. external snoop, orc. cross SMT-HW-thread snoop (stores) hitting load buffer.

因为Memory disambiguation引发的流水线清除被称作”Machine clears”,这一PMU事件反映的就是这一问题。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero