jal*_*alf 37 x86 winapi atomic interlocked memory-alignment
Microsoft提供了InterlockedCompareExchange执行原子比较和交换操作的功能.还有一个内在的._InterlockedCompareExchange
在x86上,这些是使用lock cmpxchg指令实现的.
但是,通过阅读这三种方法的文档,他们似乎并不同意对齐要求.
英特尔的参考手册没有说明对齐(除了如果启用了对齐检查并且进行了未对齐的内存引用,则会生成异常)
我也查找了lock前缀,具体说明了这一点
锁定前缀的完整性不会受到内存领域的对齐方式.
(强调我的)
所以英特尔似乎认为对齐是无关紧要的.无论如何,这个操作都是原子的.
该_InterlockedCompareExchange固有的文档也只字未提对齐,但是InterlockedCompareExchange 功能指出,
该函数的参数必须在32位边界上对齐; 否则,该函数将在多处理器x86系统和任何非x86系统上表现不可预测.
什么给出了什么?对齐要求是否InterlockedCompareExchange只是为了确保该功能即使在cmpxchg指令不可用的486之前的CPU上也能正常工作?这看起来很可能基于上述信息,但在依赖它之前我想确定一下.:)
或者ISA需要对齐以保证原子性,我只是在英特尔的参考手册中找错了地方?
Mac*_*ser 11
86并没有要求对对齐lock 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位边界.
在上最新的Intel的文档,特别是卷-3A讲述了一个不同的故事.
例如,在Core-i7处理器上,您仍然必须确保您的数据不会跨越缓存行,否则操作不能保证是原子的.
在第3A卷,系统编程,对于x86/x64,英特尔明确指出:
8.1.1保证原子操作
Intel486处理器(以及之后的新处理器)保证始终以原子方式执行以下基本内存操作:
- 读或写一个字节
- 读取或写入在16位边界上对齐的字
- 读取或写入在32位边界上对齐的双字
奔腾处理器(以及更新的处理器)保证以下额外的内存操作将始终以原子方式执行:
- 读取或写入在64位边界上对齐的四字
- 16位访问非缓存内存位置,适合32位数据总线
P6系列处理器(以及之后的新处理器)保证以下额外的内存操作将始终以原子方式执行:
- 未对齐的16位,32位和64位访问缓存内存,适合缓存行
通过英特尔酷睿2双核处理器,英特尔®凌动™,英特尔酷睿双核处理器,奔腾M,奔腾4,英特尔至强,P6系列,奔腾,以及分配到缓存行和页面边界的可缓存内存访问不能保证是原子的. Intel486处理器.Intel Core 2 Duo,Intel Atom,Intel Core Duo,Pentium M,Pentium 4,Intel Xeon和P6系列处理器提供总线控制信号,允许外部存储器子系统将分离访问原子化; 但是,非对齐数据访问会严重影响处理器的性能,应该避免
| 归档时间: |
|
| 查看次数: |
5202 次 |
| 最近记录: |