- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一方面,维基百科写了乱序执行的步骤:
- Instruction fetch.
- Instruction dispatch to an instruction queue (also called instruction buffer or reservation stations).
- The instruction waits in the queue until its input operands are available. The instruction is then allowed to leave the queue before earlier, older instructions.
- The instruction is issued to the appropriate functional unit and executed by that unit.
- The results are queued.
- Only after all older instructions have their results written back to the register file, then this result is written back to the register file. This is called the graduation or retire stage.
To make programs behave as if they were running on a simple in-order pipeline, the instruction fetch and decode unit is required to issue instructions in order, which allows dependences to be tracked, and the commit unit is required to write results to registers and memory in program fetch order. This conservative mode is called in-order commit... Today, all dynamically scheduled pipelines use in-order commit.
最佳答案
TL:DR:内存排序与乱序执行不同。它甚至发生在有序流水线 CPU 上。
有序提交对于精确的异常是必要的1,这些异常可以回滚到出错的确切指令,而在该指令已经退出之后没有任何指令。乱序执行的基本规则是不要破坏单线程代码。如果您在没有任何其他机制的情况下允许乱序提交(退出),则可能会发生页面错误,而稍后的一些指令已经执行一次,和/或一些较早的指令尚未执行。这将使以正常方式处理页面错误后无法重新启动执行。
(按顺序发出/重命名和依赖跟踪负责在正常情况下正确执行,没有异常(exception)。)
内存排序与其他内核所见有关。另请注意,您引用的只是将结果提交到寄存器文件,而不是内存。
( 脚注 1 : Kilo-instruction Processors: Overcoming the Memory Wall 是一篇关于检查点状态的理论论文,允许在发生异常之前的某个时间点回滚到一致的机器状态,从而允许更大的无序窗口而没有巨大的 ROB AFAIK,没有主流商业设计使用过它,但它表明除了严格按顺序退休之外,理论上还有其他方法来构建可用的 CPU。
据报道,Apple 的 M1 的乱序窗口比它的 x86 同时代产品大得多,但我没有看到任何明确的信息表明它使用了非常大的 ROB 之外的任何东西。)
由于每个内核的私有(private) L1 缓存与系统中的所有其他数据缓存一致,内存排序是指令何时读取或写入缓存的问题 .这与他们从无序核心退休时是分开的。
当负载从缓存中读取数据时,它们变得全局可见。这或多或少在他们“执行”时,而且绝对是在他们退休(又名提交)之前。
存储在其数据被提交到缓存时变得全局可见。这必须等到它们被认为是非推测性的,即没有异常或中断会导致必须“撤消”存储的回滚。因此,存储可以早在从乱序核心退出时就提交到 L1 缓存。
但即使是有序 CPU 也使用存储队列或 store buffer隐藏 L1 缓存中未命中的存储的延迟。一旦知道它肯定会发生,乱序机器就不需要继续跟踪存储,因此存储 insn/uop 甚至可以在提交到 L1 缓存之前退出。存储缓冲区保留它,直到 L1 缓存准备好接受它。即当它拥有缓存行时(the MESI cache coherency protocol 的独占或修改状态),并且内存排序规则允许存储现在全局可见。
另请参阅我对 Write Allocate / Fetch on Write Cache Policy 的回答
据我了解,当商店的数据在乱序核心中“执行”时,它会被添加到商店队列中,这就是商店执行单元所做的事情。 (存储地址写入地址,存储数据将数据写入分配/重命名时为其保留的存储缓冲区条目,因此这些部分中的任何一个都可以首先在这些部分单独调度的 CPU 上执行,例如英特尔。 )
负载必须探测存储队列,以便他们看到最近存储的数据。
对于像 x86 这样具有强排序的 ISA,存储队列必须保留 ISA 的内存排序语义。即商店不能与其他商店重新排序,并且商店不能在更早的加载之前成为全局可见的。 (LoadStore reordering isn't allowed (nor is StoreStore or LoadLoad), only StoreLoad reordering)。
大卫坎特的 article on how TSX (transactional memory) could be implemented in different ways than what Haswell does提供了对内存顺序缓冲区的一些见解,以及它是如何与跟踪指令/微指令重新排序的重新排序缓冲区 (ROB) 分开的结构。他首先描述了当前的工作方式,然后介绍了如何对其进行修改以跟踪可以作为一个组提交或中止的事务。
关于cpu - 乱序指令执行: is commit order preserved?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39670026/
我正在寻找通过 sql 查询对我的 sql 结果进行排序,大概在 order by 子句中使用某种嵌套的 order by/order by 我有以下数据: TERM USER I
我有一个表格,其中包含如下所示的部分数据。我已经在 edition_id 上完成了订购。现在还需要订购 laungauge_id,这取决于 edition_id 的值。 Edition_id 是指报纸
所以我有两个表,Questions 和 Answers,由多对多关系表 QuestionsAnswers 连接。 Questions 有一个排序列,允许我控制它们如何显示给用户,而 Questions
当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用: f.g.h 那么它叫“三阶”函数吗? “高阶”函数是静态函数累加的概念吗?然后当我有一个递归函数 f 时,在运行时
在具有多个 order by 子句的 SQL 查询中,它们是否真的在执行期间全部运行? 例子: select * from my_table order by field5, field3, fiel
我跟进 query其中 schema.org 数据库用于查找类的子级数量 - 作为比我的应用程序更简单的数据库。我想按字母顺序连接 child 的名字。查询: prefix schema: pre
正如 nazdrovje 所指出的(参见 here ) Ordering@Ordering 可用于获取列表中每个元素的排名。即使列表包含重复元素,结果也是 n 排列(作为整数 1 到 n 的有序列表,
我有两张 table 。 它们都有日期和 item_id 列。 我正在通过 item_id 加入他们。 结果应按两个日期列一起排序 下面的代码有效,生成正确的结果集... 但是它们仅按第一个表的日期排
尝试掌握 SQL 我想按日期订购,然后在其中按标题订购。 示例: SELECT * FROM tblboek ORDER BY jr_van_uitgave DESC 如何在按年龄的订单中按头衔排序?
我想使用 FIELD 参数对我的 SQL 输出进行排序,但是当我这样做时,它首先吐出我不想要的结果,然后它首先吐出我想要的结果。在结果之上,它首先吐出。如果这有意义的话 ;) 如何先吐出已定义的值,然
我有一个无法破解的排序问题。我这样从我的表中选择: SELECT * FROM 'sidemodules' WHERE name = 'module1' OR name = 'module2' OR
我对 Django oscar 的覆盖模型有疑问。我想为模型添加一个新字段,但是当我这样做时,我遇到了 RuntimeError: Conflicting 'order' models in appl
我有两个表,电影和类别,我想先按CategoryID获得一个排序列表,然后按名称排序。。电影表格有三个列ID、NAME和CategoryID。CATEGORY表有两列ID和NAME。。我尝试了下面这样
In a MySQL query, when using the DISTINCT option, does ORDER BY apply after the duplicates are re
我想创建一个 sql 查询,为 2 个不同的查询一起返回结果。例如,我想要以下形式的结果:产品名称, avg(price), min(price), max(price), avg(order), m
我正在使用行号从存储过程中获取分页结果。 我发现使用动态 case 语句列名称进行排序会减慢速度 - 但如果我对所有内容进行硬编码就可以了。 有没有办法通过不使整个 sql 查询一个字符串并使用 SP
如何在范围搜索中使用Morton Order? 在wiki中,在“使用一维数据结构进行范围搜索”段落中, 它说 "the range being queried (x = 2, ..., 3, y =
我正在使用 sequelize.js,我在使用 order 语句时遇到问题,我想先通过 if id 排序(如果我的 id 在该别名表中),然后再排序.... order = [['alias', 'i
我有一个 php 脚本,它从数据库中提取内容并以某种方式打印它们。数据库有一个名为“order”的列标题,它的 INT 大小为 11。当我从数据库中获取数据时,我试图按数据库中的值“order”对内容
我有一个带有 ORDER BY 子句的 UPDATE 查询。我已将相同的查询复制到具有相同 ORDER BY 子句的 SELECT 中,但得到了不同的结果。 更新查询: UPDATE t_locks
我是一名优秀的程序员,十分优秀!