在Intel x86 CPU上进行比较和交换(CAS)的最快方法?

时间:2014-11-20 12:27:23

标签: performance assembly x86 latency cpu-architecture

我需要交换两个8x字节的内存区域,最有可能使用CMPXCHG8B。但是,我想尽快做到这一点。其他线程将等待此操作完成。我有几个与此有关的问题:

- 如果我使用多个处理器或多个核心,则仅需要LOCK前缀?如果可能的话,我真的想避免使用它。

- 我是否能够锁定"如果等待线程希望访问的内存位于不同的缓存行中,则基于MESI协议而不使用LOCK前缀?

我在一个处理器(多个内核)上运行,但是解答多处理器系统差异的答案 - 如果存在差异则欢迎。

1 个答案:

答案 0 :(得分:1)

如果您有多个处理器或多个内核,并且希望对共享变量进行同步安全访问,则无法避免LOCK。 (使用XCHG并不能避免锁定;它只是隐藏在指令中。)

按照杰斯特的提示,我很想给你的两块记忆命名"左边"和"右",并使用FLAG动态重命名它们,例如

    GetLeft:  if LSB(FLAG)   ; least significant bit
              Read Left
              else Read Right

    GetRight: if LSB(FLAG)
              Read Right
              else Read Left

然后以下代码将"交换"他们可以尽快完成:

    SwapLeftAndRight: 
               LOCK INC FLAG   ; flips LSB of flag

这消除了对互斥锁的任何需求。 (如果您的主题正在尝试更新这些区域,无论您做什么,都需要互斥锁。)

如果访问速度实际上很关键,那么他关于将两个连续指针交换到LEFT和RIGHT的提示非常好。