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。