原子指令可以跨越缓存行吗?

时间:2015-10-23 17:26:54

标签: assembly x86 intel cpu-architecture

LOCK DEC这样的x86指令是否可以跨越多个缓存行,或者它们是否会出错?

不询问他们是否,只是它是否允许。

(我知道某些SSE指令必须在缓存边界上对齐)

2 个答案:

答案 0 :(得分:4)

是的,这是允许的。你也可以尝试一下。或者阅读指令集参考:

  

LOCK前缀的完整性不受对齐的影响   记忆领域。任意观察记忆锁定   未对齐的字段。

但另见:

  

例外

     

#AC(0)如果启用了对齐检查,并且在当前权限级别为3时进行了未对齐的内存引用。

请注意,通常不启用对齐检查。

答案 1 :(得分:4)

它是允许的,但是你可能会遇到巨大的性能下降,因为锁可能无法在缓存中维护,并且可能会降级为完整的总线锁(有效地完全停止系统)。 / p>

参见例如 - https://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-ia32-architectures

  

在英特尔486处理器的时代,锁定前缀用于断言a   锁定在公共汽车上以及性能的巨大打击。从...开始   在英特尔奔腾Pro架构中,总线锁被转换为   缓存锁定。最多仍然会在总线上锁定一个锁   现代架构,如果锁位于不可缓存的内存中或者如果   锁延伸超出缓存行边界分割缓存行。   这两种情况都不太可能,因此大多数锁前缀都是   变成了一个更便宜的缓存锁。

它可能会根据处理器规格而有所不同,但请注意另一个考虑因素是跨越边界线也可能意味着越过页面边界,这更难维护(因此甚至更有可能降级)。