hid*_*atz 3 memory cpu cpu-architecture memory-barriers
在我的理解中,CPU为了优化而改变了写在机器代码上的操作顺序,这被称为乱序执行。
在术语“内存顺序”中,它定义了访问内存的顺序。例如,在宽松的顺序中,它定义了非常弱的排序规则,并且很容易发生执行重排序。
x86 中有一些内存排序模型,例如 TSO。在这样的存储器排序模型中,定义了处理器的存储器访问顺序的语义。
我不明白的是他们之间的关系。内存顺序是一种乱序执行吗?OoOe还有其他方法吗?
或者说,内存顺序是乱序执行的实现,处理器的所有重新排序都是基于语义的吗?
一般问题是,在现代多处理器系统上,加载和存储指令可能以与程序顺序不同的顺序对其他内核可见。无序执行是发生这种情况的一种方式,但还有其他方式。
例如,您可以拥有一个按严格的程序顺序执行和退出所有指令的 CPU,但当它执行存储指令时,它不会立即将其提交到 L1 缓存,而是将其放入存储缓冲区中,以便稍后写入缓存。存储缓冲区可以设计为以与输入不同的顺序写出存储;例如,如果第一个存储未命中 L1 缓存,但第二个存储命中,则可以通过在等待第一个存储行加载时写出第二个存储来节省时间。
或者,即使存储缓冲区没有重新排序,也可能会出现这样的情况:当存储仍在存储缓冲区中等待时,CPU 会执行按程序顺序稍后出现的加载指令。因此,其他核心将在存储之前看到负载发生。例如,x86 就是这种情况。
内存排序模型以抽象的方式定义了程序员有权期望的关于加载和存储对其他核心(或硬件等)可见的顺序的内容。它还通常指定程序员如何在需要时获得更强的保证(例如通过执行屏障指令)。然后,CPU 必须设计为提供定义的行为,这可能会对其可以包含的功能施加限制。例如,如果架构承诺 TSO,CPU 可能无法包含能够重新排序的存储缓冲区,除非它们设法以一种巧妙的方式做到这一点,使其他核心永远不会注意到重新排序。
相关问题:
| 归档时间: |
|
| 查看次数: |
942 次 |
| 最近记录: |