繁体   English   中英

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

[英]Do atomic operations become slower as more CPUs are added?

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

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

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

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

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

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

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

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

如果要编写代码以保持最后,请尽量避免锁定。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM