multithreading - 为什么存在弱内存模型,它们的指令顺序是如何选择的?

标签 multithreading memory parallel-processing memory-model

ARM 等 CPU 具有弱内存模型。假设我们有两个线程 T1 和 T2。

| T1      | T2      |
|---------|---------|
| Instr A | Instr C |
| Instr B | Instr D |

在弱顺序中,任何指令都可以随时运行,这意味着“D -> A -> B -> C”是可能的。

我的第一个问题是这为什么有益?我的第二个问题是选择(优化)是如何完成的? CPU 是随机选择它们还是背后有算法?是 CPU 在进行采摘还是有另一个芯片在进行工作(内存芯片或其他东西)?

最佳答案

没有全局仲裁者会做任何这样的事情。如果有的话,总是按顺序做事会很有效。

唯一立即可用的数据是本地数据。每次执行都会根据快速可用的信息做出决定。

没有压力以相反的顺序而不是按书面顺序执行任何事情。储备并不是先验的更好。但是 B 的数据可能先于 A 的数据可用,然后 B 可能会先执行,因为等待 A 完成会使计算资源未被使用。

因此,关键在于在需要时提供所有数据,以及处理器之间的通信延迟。您可以将其视为与只能通过非常缓慢的沟通方式进行交流的人们合作的团队努力:他们将根据本地可用的信息完成尽可能多的工作。没有中央权力机构能够准确了解最新完成的工作的状态。

关于multithreading - 为什么存在弱内存模型,它们的指令顺序是如何选择的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58870009/

相关文章:

c - 迭代列表 lst 并将函数 f 应用于每个链接以创建 “fresh” 列表

multithreading - C++ fork/std::thread 和 boost::timed_join

c++ - 使用线程访问数据库

Python 线程/多处理不需要 Mutex?

css - 加载 CSS 和性能

c# - BigInteger阶乘的并行计算

iOS:从后台线程创建 UIImage?

c++ - 解释 Valgrind 内存泄漏摘要日志

parallel-processing - 当向量大小不能被 4 整除时,使用 cuda 向量类型 float 4

delphi - 在 Delphi 中查找可用的 LPT(并行)端口和地址