在x86 CPU上优化受防护的内存存储

时间:2018-03-10 21:21:21

标签: assembly x86 memory-barriers

mov 0x0ff, 10
sfence 
mov 0x0ff, 12
sfence

它可以由x86-CPU执行:

 mov 0x0ff, 12
 sfence

1 个答案:

答案 0 :(得分:3)

是的,某些CPU可能会按照您的建议执行它。

即使您在其中放置了诸如mfence之类的更坚固的围栏,或者使用了锁定指令,也肯定没有保证可以使第一次写操作没有得到优化。

通常这是正确的:排序规则和防护规则基本上会告诉您哪些执行是不允许的,因此保证永远不会发生,而是考虑允许使用的互补执行集发生通常通常不能保证可以实际观察到任何特定的执行。

那就是说,我很确定,尽管有任何存储缓冲区合并,但在当前的x86芯片上,即使有任何存储缓冲区合并,您也总是能够观察到偶尔出现的10值(即使栅栏被完全省略了),因为您偶尔会遇到中断在两个商店之间,您可以阅读10。

不过,这还不能保证-可以肯定地想到,像Denver或Transmeta这样的动态优化x86架构可以压缩上面的序列,同时删除篱笆和第一家商店,使20成为唯一可观察的价值。