英特尔Cpus上atomics cmpxchg指令的平均延迟

San*_*eep 7 x86 multithreading atomic lock-free


我正在寻找关于各种英特尔处理器的锁定cmpxchg指令的平均延迟的一些参考.我无法找到关于该主题的任何好的参考,任何参考都会有很大帮助.

谢谢.

Zoo*_*oba 5

很少(如果有的话)对此有很好的参考,因为有太多的变化。它基本上取决于一切,包括总线速度、内存速度、处理器速度、处理器数量、周围指令、内存栅栏以及很可能月球和珠穆朗玛峰之间的角度......

如果您有一个非常具体的应用程序,例如已知(固定)硬件、操作环境、实时操作系统和独占控制,那么它可能很重要。在这种情况下,基准。如果您对软件运行的位置没有这种级别的控制,那么任何测量实际上都毫无意义。

正如这些答案中所讨论的,锁是使用 CAS 实现的,因此如果您可以使用 CAS 而不是锁(这将需要至少两个操作),它会更快(明显?只有可能)。

您将找到的最佳参考资料是Intel Software Developer's Manuals,但由于变化太大,它们不会为您提供实际数字。然而,他们将描述如何获得最佳性能。可能是处理器数据(如这里的i7至尊版,在“技术文件”)会给你实际的数字(或至少是一个范围)。

  • x86 上的指令“lock cmpxchg”_is_ CAS。 (3认同)
  • FWIW,并非所有锁都需要两个“CAS”操作。x86 上的许多锁在获取路径上使用 `CAS` 或 `xchg` 实现,但在解锁路径上使用简单的存储。x86 内存模型足够强大,可以让它工作。 (2认同)

Art*_*ken 5

最好的 x86 指令延迟参考可能包含在Agner 的优化手册中,基于对各种 Intel/AMD/VIA 芯片的实际经验测量,并且经常针对市场上最新的 CPU 进行更新。

不幸的是,我没有看到CMPXCHG指令延迟表中列出的指令,但第 4 页确实指出:

带有 LOCK 前缀的指令具有较长的延迟,这取决于缓存组织和可能的 RAM 速度。如果有多个处理器或内核或直接内存访问 (DMA) 设备,则所有锁定的指令都将锁定高速缓存行以进行独占访问,这可能涉及 RAM 访问。一个 LOCK 前缀通常花费超过一百个时钟周期,即使在单处理器系统上也是如此。这也适用于带有内存操作数的 XCHG 指令。

  • 现在低于45个周期。我刚刚对 LOCK INC 进行了基准测试 - 它不到 35 个周期(无争议时) (4认同)
  • 我认为这是过时的。我记得曾经做过这样的测试。我记得从 Intel Core Duo 处理器开始,`lock` 前缀的*成本*下降到大约 45 个周期。 (3认同)