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

时间:2010-11-15 19:14:03

标签: multithreading x86 atomic lock-free


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

感谢。

5 个答案:

答案 0 :(得分:4)

对此有很少的参考,因为有很多变化。它基本上取决于所有东西,包括总线速度,内存速度,处理器速度,处理器数量,周围指令,内存屏障以及月亮和珠穆朗玛峰之间的角度......

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

正如these answers中所讨论的,锁是使用CAS实现的,所以如果你可以使用CAS而不是锁(它至少需要两次操作),它会更快(显然也许只有)。

你会发现最好的参考文献是Intel Software Developer's Manuals,但由于变化太大,他们不会给你一个实际数字。但是,他们将描述如何获得最佳性能。可能是处理器数据表(例如“技术文档”下的i7至尊版的那些here)将为您提供实际数字(或至少一个范围)。

答案 1 :(得分:4)

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

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

  

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

答案 2 :(得分:2)

我几个月来一直在寻找指数退避。

CAS的延迟完全取决于指令是否可以从缓存操作或必须从内存操作。通常,给定的内存地址由多个线程(例如,指向队列的条目指针)进行CAS化。如果最近成功的CAS由逻辑处理器执行,该逻辑处理器与当前CAS执行器(L1,L2或L3共享缓存,当然更高级别更慢),则指令将在缓存上运行并且将快速 - a几个周期。如果最近成功的CAS由不与当前激励器共享缓存的逻辑核心执行,那么写入最新的CASer将使当前执行器的缓存行无效并且需要读取内存 - 这将是需要数百个周期。

CAS操作本身非常快 - 几个周期 - 问题是记忆。

答案 3 :(得分:2)

您可以使用AIDA64软件检查指令延迟(但您无法检查要检查的指令,它有一个硬编码的指令列表)。人们正在http://instlatx64.atw.hu/

发布结果

通过lock说明,AIDA64会验证lock add指令和xchg [mem](即使没有显式锁定prefix也始终锁定

以下是一些信息。为了比较,我还会告诉您以下说明的延迟:

  • xchg reg1, reg2没有锁定;
  • add注册和记忆。

如您所见,锁定指令在Haswell-DT上只慢5倍,在Kaby Lake-S上比非锁定内存存储慢~2倍。

Intel Core i5-4430,3000 MHz(30 x 100)Haswell-DT

LOCK ADD [m8], r8         L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
LOCK ADD [m16], r16       L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
LOCK ADD [m32], r32       L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
LOCK ADD [m32 + 8], r32   L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
LOCK ADD [m64], r64       L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
LOCK ADD [m64 + 16], r64  L: 5.96ns= 17.8c  T: 7.21ns= 21.58c

XCHG r8, [m8]             L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
XCHG r16, [m16]           L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
XCHG r32, [m32]           L: 5.96ns= 17.8c  T: 7.21ns= 21.58c
XCHG r64, [m64]           L: 5.96ns= 17.8c  T: 7.21ns= 21.58c

ADD r32, 0x04000          L: 0.22ns=  0.9c  T: 0.09ns=  0.36c
ADD r32, 0x08000          L: 0.22ns=  0.9c  T: 0.09ns=  0.36c
ADD r32, 0x10000          L: 0.22ns=  0.9c  T: 0.09ns=  0.36c
ADD r32, 0x20000          L: 0.22ns=  0.9c  T: 0.08ns=  0.34c
ADD r8, r8                L: 0.22ns=  0.9c  T: 0.05ns=  0.23c
ADD r16, r16              L: 0.22ns=  0.9c  T: 0.07ns=  0.29c
ADD r32, r32              L: 0.22ns=  0.9c  T: 0.05ns=  0.23c
ADD r64, r64              L: 0.22ns=  0.9c  T: 0.07ns=  0.29c
ADD r8, [m8]              L: 1.33ns=  5.6c  T: 0.11ns=  0.47c
ADD r16, [m16]            L: 1.33ns=  5.6c  T: 0.11ns=  0.47c
ADD r32, [m32]            L: 1.33ns=  5.6c  T: 0.11ns=  0.47c
ADD r64, [m64]            L: 1.33ns=  5.6c  T: 0.11ns=  0.47c
ADD [m8], r8              L: 1.19ns=  5.0c  T: 0.32ns=  1.33c
ADD [m16], r16            L: 1.19ns=  5.0c  T: 0.21ns=  0.88c
ADD [m32], r32            L: 1.19ns=  5.0c  T: 0.22ns=  0.92c
ADD [m32 + 8], r32        L: 1.19ns=  5.0c  T: 0.22ns=  0.92c
ADD [m64], r64            L: 1.19ns=  5.0c  T: 0.20ns=  0.85c
ADD [m64 + 16], r64       L: 1.19ns=  5.0c  T: 0.18ns=  0.73c

Intel Core i7-7700K,4700 MHz(47 x 100)Kaby Lake-S

LOCK ADD [m8], r8         L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
LOCK ADD [m16], r16       L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
LOCK ADD [m32], r32       L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
LOCK ADD [m32 + 8], r32   L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
LOCK ADD [m64], r64       L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
LOCK ADD [m64 + 16], r64  L: 4.01ns= 16.8c  T: 5.12ns= 21.50c

XCHG r8, [m8]             L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
XCHG r16, [m16]           L: 4.01ns= 16.8c  T: 5.12ns= 21.50c
XCHG r32, [m32]           L: 4.01ns= 16.8c  T: 5.20ns= 21.83c
XCHG r64, [m64]           L: 4.01ns= 16.8c  T: 5.12ns= 21.50c

ADD r32, 0x04000          L: 0.33ns=  1.0c  T: 0.12ns=  0.36c
ADD r32, 0x08000          L: 0.31ns=  0.9c  T: 0.12ns=  0.37c
ADD r32, 0x10000          L: 0.31ns=  0.9c  T: 0.12ns=  0.36c
ADD r32, 0x20000          L: 0.31ns=  0.9c  T: 0.12ns=  0.36c
ADD r8, r8                L: 0.31ns=  0.9c  T: 0.11ns=  0.34c
ADD r16, r16              L: 0.31ns=  0.9c  T: 0.11ns=  0.32c
ADD r32, r32              L: 0.31ns=  0.9c  T: 0.11ns=  0.34c
ADD r64, r64              L: 0.31ns=  0.9c  T: 0.10ns=  0.31c
ADD r8, [m8]              L: 1.87ns=  5.6c  T: 0.16ns=  0.47c
ADD r16, [m16]            L: 1.87ns=  5.6c  T: 0.16ns=  0.47c
ADD r32, [m32]            L: 1.87ns=  5.6c  T: 0.16ns=  0.47c
ADD r64, [m64]            L: 1.87ns=  5.6c  T: 0.16ns=  0.47c
ADD [m8], r8              L: 1.89ns=  5.7c  T: 0.33ns=  1.00c
ADD [m16], r16            L: 1.87ns=  5.6c  T: 0.26ns=  0.78c
ADD [m32], r32            L: 1.87ns=  5.6c  T: 0.28ns=  0.84c
ADD [m32 + 8], r32        L: 1.89ns=  5.7c  T: 0.26ns=  0.78c
ADD [m64], r64            L: 1.89ns=  5.7c  T: 0.33ns=  1.00c
ADD [m64 + 16], r64       L: 1.89ns=  5.7c  T: 0.24ns=  0.73c

答案 4 :(得分:0)

我一直在尝试根据NOP对CAS和DCAS进行基准测试。

我有一些结果,但我还不信任它们 - 验证正在进行中。

目前,我在Core i5上看到CAS / DCAS 3/5 NOP。在Xeon上,我看到20/22。

这些结果可能完全不正确 - 你被警告了。