我正在寻找关于各种英特尔处理器的锁定cmpxchg指令的平均延迟的一些参考。我无法找到关于该主题的任何好的参考,任何参考都会有很大的帮助。
感谢。
答案 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倍。
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
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。
这些结果可能完全不正确 - 你被警告了。