【发布时间】:2018-08-19 05:29:38
【问题描述】:
mov 0x0ff, 10
sfence
mov 0x0ff, 12
sfence
x86-CPU 是否可以这样执行:
mov 0x0ff, 12
sfence
?
【问题讨论】:
-
两个
sfence指令都是多余的(相关:Does SFENCE prevent the Store Buffer hiding changes from MESI?)。但即使没有它们,我 认为 有时另一个线程也可以观察到10。不过,有一些证据表明在存储提交到 L1D 之前存储队列中的合并。 (但我找不到关于那个的 SO 答案或 cmets)。 -
找到它:Unexpectedly poor and weirdly bimodal performance for store loop on Intel Skylake 有一些证据表明同一缓存行的相邻存储在存储缓冲区中合并/合并并作为一个更新提交。如果在 same 位置的商店发生这种情况,那么
10可能永远不会提交给 L1d。我不知道sfence是否会阻止这种情况;我认为在纸面上它不必这样做,但它可能会阻止合并实际 CPU。 -
@PeterCordes
sfence耗尽存储缓冲区(根据英特尔),因此它应该防止合并。订购是多余的,但我认为这不是为了提高知名度。 -
@eugene - sfence 不是无操作的,因为它隔离了通常不会相对于彼此或常规存储进行排序的非临时存储。
-
@margaret - 我还阅读了英特尔文档,他们将
sfence列为耗尽存储缓冲区,但我发现很难相信(至少在之前同步耗尽存储缓冲区的意义上)退休),因为它似乎暗示sfence; lfence对 mfence 来说是 eauivlant 但英特尔明确表示它不是,而且它执行得相当快,所以作为一个实际问题,我认为它不是等效的。我觉得这种语言是从早期遗留下来的,不能依赖,尽管我承认不清楚。
标签: assembly x86 memory-barriers