如何在互斥锁上执行解锁/锁定操作比从内存中获取更快?

时间:2017-06-21 11:09:05

标签: cpu mutex latency

Norvig声称,互斥锁定或解锁操作只需要从内存中获取所需时间的四分之一。

answer解释说,互斥锁是 本质上是一个标志和一个等待队列,并且只需要几条指令就可以在无争用的互斥锁上翻转标志。

  1. 我假设,如果不同的CPU或核心试图锁定该互斥锁,则需要等待 要写回内存的缓存行(如果尚未发生)和自己的内存读取以获取标志的状态。那是对的吗?有什么区别,如果它与不同的CPU相比是一个不同的核心?

  2. 因此,Norvig所述的数字仅适用于无竞争的互斥锁,其中尝试操作的CPU或核心已在其缓存中具有该标志且缓存行不脏?

1 个答案:

答案 0 :(得分:2)

典型的PC运行x86 CPU,Intel的CPU可以完全在缓存上执行锁定:

  

如果在LOCK操作期间锁定的内存区域是   缓存在执行LOCK操作的处理器中作为回写内存并完全包含在内   在高速缓存行中,处理器可能不会在总线上断言LOCK#信号    相反,它将在内部修改内存位置并允许其缓存一致性机制,以确保操作以原子方式执行。
   这个   操作称为“缓存锁定”   缓存一致性机制自动阻止缓存相同内存区域的两个或多个处理器同时修改该区域中的数据。

     

来自Intel Software Developer Manual 3, Section 8.1.4

缓存一致性机制是MESI协议的变体 在CPU可以写入缓存位置之前的此类协议中,它必须具有处于Exclusive(E)状态的相应行 这意味着一次只有一个CPU具有处于脏状态的给定内存位置 当其他CPU想要读取相同的位置时,所有者CPU将延迟这些读取,直到原子操作完成为止 然后它遵循一致性协议来转发,无效或回写该行。

在上面的场景中,锁可以比未缓存的负载更快地执行。

然而,那些时候有点过时并且肯定已经过时了 它们旨在在典型操作中提供订单以及一个数量级 L1命中的时间有点奇怪,它不比典型的指令执行快(它本身不能用一个数字来描述)。
英特尔优化手册报告,对于像Sandy Bridge这样的旧CPU,L1访问时间为4个周期,而有很多指令的延迟时间为4个周期。

我会把这些数字拿出来,避免在他们身上做太多推理 Norvig试图告诉我们的教训是:硬件是分层的,越接近(从拓扑的角度来看, 1 )到CPU,速度越快。
因此,在解析文件时,程序员应该避免将数据来回移动到文件中,而应该最小化IO压力。
有些在处理数组时适用,局部性会提高性能 但请注意,这些是技术上的micro-optimisations and the topic is not as simple as it appears

1 一般来说,将硬件划分为:内核(寄存器),CPU内部(缓存,可能不是LLC),插槽内部(GPU,LLC),后面专用总线设备(内存,其他CPU),在一个通用总线(PCIe - 内部设备,如网卡)后面,在两个或多个总线(USB设备,磁盘)后面,在另一台计算机后面(服务器)。