随着更多CPU的添加,原子操作会变慢吗?

Jos*_*vin 17 multithreading caching locking atomic lock-free

x86和其他体系结构提供了特殊的原子指令(lock,cmpxchg等),允许您编写"无锁"数据结构.但随着越来越多的内核被添加,似乎这些指令实际上必须在幕后进行的工作将会增长(至少是为了保持缓存一致性?).如果原子添加在双核系统上今天需要大约100个周期,那么未来的80多个核心机器上可能需要更长的时间吗?如果您要将代码编写为最后一个,那么即使它们今天变慢,使用锁实际上是否更好?

Pau*_*ieh 14

你是正确的,一旦计数开始高于几十个,拓扑约束将以这种或那种方式增加核之间的通信延迟.我真的不知道x86公司对于处理这种扩展的意图是什么.

但是锁是在原子操作方面实现的.因此,您并没有真正尝试切换到它们,除非它们以比您自己的手动原子操作尝试的更可扩展的方式实现.我认为通常,对于单个类似令牌的争论,无论你拥有多少个核心,原子原语总是仍然是最快的方式.

正如Cray很久以前发现的那样,这里没有免费的午餐.高级软件设计,尽可能不频繁地使用可能有争议的资源,总是会导致大规模并行化应用程序的最大支出.这意味着在锁定获取的同时尽可能多地完成工作,但也要尽快完成.在极端情况下,这可能意味着在成功获得锁定的假设下预先计算您的工作,尝试抓住它,并在成功时尽快完成,否则丢弃您的工作并重试失败.


Lou*_*arg 7

对于标题中提出的问题,简短的回答是"是",答案很长,"它很复杂".

关于锁更好,没有.在内部,锁必须至少推动总线上的流量(如果不是更多).想一想,如果处理器只有一个原子操作,一个原子比较和交换,你可以用它来实现锁和原子增量.在总线协议级别,只有少数基元被使用.锁定并不比原子操作慢,因为它们正在做一些不同的事情,它们更慢,因为它们正在做更多相同的事情(从一致性的角度来看).因此,随着原子操作的减速,锁定将会相对减慢.

话虽如此,有很多很多关于这个问题的论文,特定案例很复杂.我不担心你的代码将如何扩展到具有不可预测的性能特征的80个核心CPU(因为我们不知道它们将如何设计).要么它们的行为与我们当前的CPU一样,你的代码也能正常运行,否则它们就不会,而你现在猜到的任何东西都会出错.在大多数情况下,无论如何都会发现代码不是性能敏感的,所以它没关系,但如果确实如此,那么当你理解架构和性能特征时,适当的做法就是将来修复它.您的目标处理器.