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

时间:2009-10-18 19:42:46

标签: multithreading caching locking atomic lock-free

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

4 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:4)

我不认为问题在于原子操作会花费更长的时间;真正的问题可能是原子操作可能会阻塞其他处理器上的总线操作(即使它们执行非原子操作)。

如果您想要编写代码,请尽量避免锁定。

答案 3 :(得分:1)

在这个问题的旁注中,值得一提的是,您所指的未来已经是GPU中的现有技术。现代的四核GPU拥有多达256个内核,可以在全局(显示)内存上进行原子操作 我不确定这是如何实现的,但事实是它已经发生了。