【发布时间】:2014-11-20 12:27:23
【问题描述】:
我需要交换两个 8x 字节的内存区域,最有可能使用 CMPXCHG8B。但是,我想尽快做到这一点。其他线程将一直等待,直到此操作完成。我有几个与此相关的问题:
-只有当我使用多个处理器或多个内核时才需要LOCK前缀?如果可能的话,我真的想避免使用它。
-如果等待线程希望访问的内存位于不同的缓存行中,我是否能够基于 MESI 协议“锁定”而不使用 LOCK 前缀?
我在单处理器(多核)上运行,但如果有差异,我们非常欢迎向多处理器系统解释差异的答案。
【问题讨论】:
-
对于本次讨论,“处理器”==“核心”。
-
我认为
CMPXCHG8B在这种情况下不会对您有太大帮助,因为它只会交换寄存器和内存,而不是两个内存区域。你也许可以重写你的代码,这样你只需要交换 2 个连续的指针,或者使用互斥体。
标签: performance assembly x86 latency cpu-architecture