Can atomic instructions straddle cache lines?

5

LOCK DEC 这样的 x86 指令是否可以跨越多个缓存行,还是会导致段错误?

我只是想知道它们是否被允许这么做,而不是它们是否应该这么做。

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

2个回答

4

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

LOCK前缀的完整性不受内存字段对齐的影响。内存锁定适用于任意未对齐字段。

但请注意:

异常

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

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


4

允许使用锁定,但可能会导致性能严重降低,因为锁定可能无法在缓存内维护,并可能降级为完整的总线锁定(实际上是完全系统停顿)。

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

在 Intel 486 处理器时代,锁定前缀用于在总线上断言锁定,但性能大幅下降。从 Intel Pentium Pro 架构开始,总线锁变成了缓存锁。如果锁定位于不可缓存的内存中或者超过缓存行边界分割缓存行,则现代架构中仍然会在总线上断言锁定。这两种情况都不太可能发生,因此大多数锁定前缀将转换为缓存锁,后者要便宜得多。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接