首先看一下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 | store 1, (r2) ; 给r2中内存地址写入值1 |
这里的问题就是,这条load
指令是不是要等待第一条store
指令执行完之后才可以执行。如果r2
和r4
中保存的内存地址不相同(也不存在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事件反映的就是这一问题。