首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InterlockedExchange与内存对齐

InterlockedExchange与内存对齐
EN

Stack Overflow用户
提问于 2009-05-19 09:34:48
回答 4查看 2.7K关注 0票数 8

我感到困惑的是,微软说InterlockedExchange需要内存对齐,但是英特尔的文档说锁不需要内存对齐。我是不是漏掉了什么,什么的?谢谢

来自Microsoft库的

Platform : DLLs、进程和线程InterlockedExchange

目标参数所指向的变量必须在32位边界上对齐;否则,该函数将在多处理器x86系统和任何非x86系统上不可预测地运行。

来自英特尔软件开发人员手册的

  • 锁指令使处理器的LOCK#信号在所附指令的执行过程中被断言(将指令转化为原子指令)。在多处理器环境中,LOCK#信号确保当信号被断言时,处理器具有对任何共享存储器的独占使用。 锁前缀的完整性不受内存字段对齐的影响。对于任意不对齐的字段,可以观察到内存锁定。
  • P6中的内存排序和最近的处理器族 锁定指令有一个总的顺序.
  • 软件控制总线锁定 总线锁的完整性不受内存字段对齐性的影响。为了更新整个操作数,必须遵循锁语义。但是,为了更好的系统性能,建议锁定的访问在它们的自然边界上对齐:8位访问的任何边界(锁定与否)。·锁定字访问的16位边界。·锁定双字访问的32位边界。·锁定四字存取的64位边界。
EN

回答 4

Stack Overflow用户

发布于 2009-06-16 20:12:30

从前,微软在x86以外的处理器上支持x86,例如MIPS、PowerPC和Alpha。这些处理器都需要对它们的互锁指令进行对齐,因此Microsoft将需求放在规范中,以确保这些原语能够移植到不同的体系结构中。

票数 7
EN

Stack Overflow用户

发布于 2009-05-21 08:50:26

尽管锁前缀不需要对齐内存,而且可能用于实现InterlockedExchange()的cmpxchg操作不需要对齐,但如果操作系统启用了对齐检查,cmpxchg将在使用未对齐操作数执行时引发对齐检查异常(AC)。查看cmpxchg和类似的文档,查看保护模式异常列表。我不确定Windows是否支持对齐检查,但这并不让我感到惊讶。

票数 1
EN

Stack Overflow用户

发布于 2009-05-29 10:58:39

嘿,回答了一些有关这方面的问题,也要记住;

  1. 这里没有,没有字节级的InterlockedExchange,有,但是有16位短InterlockedExchange。
  2. 您所指的文档差异,可能只是一些文档的疏忽。
  3. 如果您想要执行Byte/位级原子访问,那么就可以使用现有的内嵌(InterlockedAnd8)或8+Xor8 8(InterlockedAnd8or8)的方法来完成这一任务。
  4. 任何您执行高性能锁定的操作(使用machiene代码,如您所讨论的),都不应该对齐(性能反模式)进行操作。
  5. xchg (带有隐式锁前缀的优化指令,由于能够缓存锁并避免对主存的完全总线锁而优化)。可以执行8位互锁操作。

我几乎忘了,从英特尔的TBB,他们有加载/存储8位的定义w/o使用隐式或显式锁定(在某些情况下);

代码语言:javascript
复制
.code 
    ALIGN 4
    PUBLIC c __TBB_machine_load8
__TBB_machine_Load8:
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
    mov ecx,4[esp]
    test ecx,7
    jne load_slow
    ; Load within a cache line
    sub esp,12
    fild qword ptr [ecx]
    fistp qword ptr [esp]
    mov eax,[esp]
    mov edx,4[esp]
    add esp,12
    ret

EXTRN __TBB_machine_store8_slow:PROC
.code 
    ALIGN 4
    PUBLIC c __TBB_machine_store8
__TBB_machine_Store8:
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
    mov ecx,4[esp]
    test ecx,7
    jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp
    fild qword ptr 8[esp]
    fistp qword ptr [ecx]
    ret
end

总之,希望这能帮你弄清楚一些事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/881820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档