primefacesx86指令的alignment要求
Microsoft提供InterlockedCompareExchange
函数来执行primefaces比较和交换操作。 还有一个_InterlockedCompareExchange
内部 。
在x86上,这些是使用cmpxchg
指令来实现的。
但是,通过阅读这三种方法的文件,他们似乎并不同意alignment要求。
英特尔的参考手册没有提到任何关于alignment的内容(除了如果启用了alignment检查并产生未alignment的内存引用,则会产生exception)
我也查了一下lock
前缀,具体说明了这一点
LOCK前缀的完整性不受内存字段alignment的影响。
(重点是我的)
所以英特尔似乎认为这种联合是无关紧要的。 无论如何,这个操作都是primefaces的。
_InterlockedCompareExchange
内在的文档也没有说alignment,但是InterlockedCompareExchange
函数声明
该函数的参数必须在32位边界上alignment; 否则,该function在多处理器x86系统和任何非x86系统上将performance不可预知。
那么给了什么? InterlockedCompareExchange
的alignment要求只是为了确保该函数即使在cmpxchg
以前的cmpxchg
指令不可用的情况下也能正常工作? 这似乎可能基于上述信息,但我想确定之前,我依靠它。 🙂
或者ISA需要alignment以保证primefaces性,而我只是在英特尔的参考手册中查找错误的地方?
您所引用的PDF是从1999年开始的,并已过时。
最新的英特尔文档 ,尤其是Volume-3A讲述了一个不同的故事。
例如,在Core-i7处理器上,您仍然必须确保您的数据不会跨越caching行,否则操作不能保证是primefaces的。
在卷3A,系统编程,对于x86 / x64英特尔明确指出:
8.1.1有保证的primefaces操作
Intel486处理器(以及更新的处理器)保证了以下基本的内存操作将始终以primefaces方式进行:
- 读或写一个字节
- 读取或写入在16位边界上alignment的单词
- 读取或写入在32位边界上alignment的双字
奔腾处理器(以及更新的处理器)确保以下附加的内存操作始终以primefaces方式执行:
- 读取或写入在64位边界上alignment的四字
- 16位访问适用于32位数据总线的未caching内存位置
P6系列处理器(以及更新的处理器)确保以下附加内存操作始终以primefaces方式执行:
- 未alignment的16,32和64位访问高速caching内存,适合caching线
Intel Core 2 Duo,Intel®Atom™,Intel Core Duo,Pentium M,Pentium 4,Intel Xeon,P6系列,Pentium以及Intel486处理器。 英特尔酷睿2双核处理器,英特尔凌动处理器,英特尔酷睿双核处理器,奔腾M处理器,奔腾4处理器,英特尔至强处理器和P6系列处理器提供总线控制信号,允许外部存储器子系统将分裂访问primefaces化; 然而,不alignment的数据访问将严重影响处理器的性能,应该避免
x86不要求cmpxchg
指令alignment。 但是,build议alignment性能。 这应该不足为奇,向后兼容意味着用14年前的手册编写的软件仍然可以运行在今天的处理器上。
为什么微软需要alignment从他们的文档不清楚。 这可能是为了性能或者支持RISC体系结构,或者两者兼而有之。
英特尔®64和IA-32架构软件开发人员手册
第3卷(3A):系统编程指南
2013年1月8.1.2.2软件控制的总线locking
要显式强制LOCK语义,软件可以在使用LOCK前缀修改内存位置时使用以下指令。 […]
交换指令(XADD,CMPXCHG和CMPXCHG8B)。
•XCHG指令自动假定LOCK前缀。
•[…][…]总线锁的完整性不受内存字段alignment的影响。 为了更新整个操作数,需要遵循LOCK语义的总线周期数。 但是,build议将locking的访问权限与其自然边界alignment以获得更好的系统性能:
•8位访问的任何边界(locking或以其他方式)。
•locking字访问的16位边界。
•locking双字访问的32位边界。
•locking四字访问的64位边界。
看到这个问题 :自然alignment对于性能很重要,而且在x64架构上是必需的(所以它不仅仅是PRE-x86系统,而且也是POST-x86系统–x64可能仍然是一个小生意,但是它正在增长毕竟是受欢迎的;-); 这可能是为什么微软按要求logging它(很难findMS是否决定通过启用alignment检查来强制alignment问题的文档 – 这可能因Windows版本而异;通过在文档中声称需要alignment,MS保留在某些版本的Windows中强制使用它,即使它们没有强制在其他版本上也是如此)。
微软的互锁API也适用于ia64(虽然它仍然存在)。 在ia64上没有locking前缀,只有cmpxchg.acq和cmpxchg.rel指令(或fetchadd和其他类似的野兽),如果我正确记得,这些都需要alignment。