对准要求原子x86说明
-
06-07-2019 - |
题
Microsoft提供的 InterlockedCompareExchange
功能用于执行原子比较和交换操作。还有一个 _InterlockedCompareExchange
征.
在x86这些都是实施使用 cmpxchg
指令。
然而,阅读过的文件在这三种方法,他们似乎并不同意对准要求。
英特尔的 参考手册 说什么关于准(其他 如果 对检查的启用和不对齐存参考了,生成异常)
我也看了 lock
前缀,其具体的国家
完整性的锁定的前缀 不 受影响的准的存储场。
(重点矿山)
所以,英特尔似乎是说,对准是无关紧要的。操作,将原子无论什么。
的 _InterlockedCompareExchange
固有的文件也没说什么关于准,但是 InterlockedCompareExchange
功能 国
的参数,这一功能必须对准上的一个32位的边界;否则,该功能将会出现不可预知的行为在多处理x86系统和任何非x86系统。
那么,什么了?是的准的要求 InterlockedCompareExchange
只是为了确保能将工作,即使在预486CPU是哪里的 cmpxchg
指令是不是?这似乎有可能根据上述信息,但是我想可以肯定之前,我要依赖它。:)
或是对准需要由ISA保证原子性,我只是在寻找错误的地方在英特尔的参考手册中?
解决方案
的 PDF你是引用 是从1999年显然已经过时。
的 最新的英特尔的文件, ,具体地说 卷-3A 告诉一个不同的故事。
例如,在一个核i7处理的,你仍然必须确保数据不不跨越缓线,或他人的作为不能保证原子.
在积3A、系统编程,用于x86/64英特尔明确指出:
8.1.1保证原子操作
该Intel486处理器(和较新的理由)可以保证下面 基本存储器操作,将一直进行自动:
- 阅读或写字节
- 阅读或写字盟在16位的边界
- 阅读或写双字上对准一个32位的边界
奔腾处理器(和较新的理由)可以保证下面 额外存储器操作,将一直进行自动:
- 阅读或写入一个四字盟在64位的边界
- 16位访问以非缓存存储的地点适合的一个32位数据的巴士
P6家庭处理器(和新的处理,因为)保证以下 额外存储器操作将一直进行自动:
- 不对齐的16,32和64位访问缓存存储器内一个高速缓存 线
访问缓存,分跨越缓线和边界页 不能保证原子通过英特尔的核心2Duo,英特尔原,英特尔的核心 二人,奔腾M、奔腾4,英特尔强,P6家庭,奔腾的,Intel486处理器。英特尔的核心2Duo,英特尔原子,英特尔的核心,奔腾M、奔腾4,英特尔强, P6和家庭处理器提供旅控制信号,允许外部存储器 子系统,使分裂的访问原子;然而,不结盟数据访问会 严重影响处理器的性能和应该避免的
其他提示
x86 不需要对齐 cmpxchg
指令。但是,建议使用对齐以提高性能。这应该不足为奇,向后兼容意味着用14年前的手册编写的软件仍然可以在今天的处理器上运行。
为什么Microsoft要求对齐并不清楚他们的文档。它可能用于性能或支持RISC架构,或两者兼而有之。
英特尔® 64和IA-32架构软件开发人员手册
第3卷(3A):系统编程指南
2013年1月8.1.2.2软件控制总线锁定
要明确强制LOCK语义,软件可以在使用LOCK前缀时使用以下说明来修改内存位置。 [...]
•交换指令(XADD,CMPXCHG和CMPXCHG8B)。
• XCHG指令自动假设LOCK前缀 • [...][...]总线锁的完整性不受对齐的影响 记忆领域。遵循LOCK语义的总线周期数 必要时更新整个操作数。但是,建议 锁定的访问在其自然边界上对齐以获得更好的效果 系统性能:
• 8位访问的任何边界(锁定或其他)。
•锁定字访问的16位边界。
•锁定双字访问的32位边界。
•锁定四字访问的64位边界。
请参阅这个问题:自然对齐对性能很重要,并且需要x64架构(所以它不仅仅是PRE-x86系统,而且也是POST-x86系统 - x64可能仍然是一个小众案例,但它毕竟越来越受欢迎;-);这可能就是微软根据需要对其进行记录的原因(很难找到有关MS是否决定通过启用对齐检查来解决对齐问题的文档 - 可能因Windows版本而异;通过在文档中声明需要对齐,MS保留了在某些版本的Windows中强制它的自由,即使它们没有强迫它在其他版本中。)
微软的Interlocked API也适用于ia64(虽然它仍然存在)。 ia64上没有锁定前缀,只有cmpxchg.acq和cmpxchg.rel指令(或者是fetchadd和其他类似的beasties),如果我没记错的话,这些都需要对齐。