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

标签 multithreading caching locking atomic lock-free

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

最佳答案

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

但是锁是根据原子操作来实现的。因此,尝试切换到它们并不会真正赢得胜利,除非它们以比您自己的手动原子操作尝试的更具可扩展性的方式实现。我认为,一般来说,对于类似单个 token 的争用,无论您拥有多少个核心,原子原语仍然是最快的方式。

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

关于multithreading - 随着更多 CPU 的添加,原子操作会变慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1585825/

相关文章:

ios - 由于多线程代码导致内存压力而终止

c++ - 如何将参数传递给已经开始运行的线程

Javascript清除本地数据

java - 如何让 Infinispan 与 Camel 一起工作

java - Nilocker 无法在 Spring Boot 应用程序中工作

mysql - MySQL如何知道是否有已经锁定的表

java - Java 中同步的可见性影响

delphi - 1055 Delphi 错误是什么?它重要吗?

html - 在 css href 中更新随机数

java - 此代码可能会引发 IllegalMonitorStateException