我读过关于维基百科页面乱序执行和投机exectution 。
我无法虽然understant是异同。 在我看来,投机执行使用乱序执行的时候还没有确定的条件。例如价值。
当我读崩溃和幽灵的论文和做更多的研究的混乱来了。 它在陈述消融纸即熔毁是基于乱序执行,而其他一些资源,包括对维基页面sepeculative执行状态消融是基于推测执行。
我希望得到一些澄清这一点。
我读过关于维基百科页面乱序执行和投机exectution 。
我无法虽然understant是异同。 在我看来,投机执行使用乱序执行的时候还没有确定的条件。例如价值。
当我读崩溃和幽灵的论文和做更多的研究的混乱来了。 它在陈述消融纸即熔毁是基于乱序执行,而其他一些资源,包括对维基页面sepeculative执行状态消融是基于推测执行。
我希望得到一些澄清这一点。
推测执行和乱序执行是正交的 。 人们可以设计一个处理器这个OOO而不是投机或投机而有序。 OOO执行是在其中的指令可以在从程序顺序可能不同的顺序来执行的执行模型。 然而,说明仍然退休计划顺序,使程序的观察到的行为是一样的一个程序员直观的预期。 (尽管可以设计一个OOO处理器退休在一定的约束条件有些不自然顺序说明,请参阅这一理念基于仿真的研究: 最大化有限的资源:一个基于限研究和分类标准外的顺序提交 )。
推测执行,从广义上讲,是其中指令可以被获取并进入管道,甚至开始执行,甚至不知道可以肯定的是他们确实将被要求执行(根据程序的控制流)的执行模型。 该术语还通常用来具体指推测执行在流水线的执行阶段。 该消融纸做第3页上定义这些术语:
在本文中,我们指的是推测性执行在更受限制的意义,它是指一个指令序列之后的一个分支,而使用术语乱序执行来指获得处理器具有前一个操作执行的任何方式承诺所有先前指令的结果。
请注意,指令可以推测执行,但有序。 当管道的解码级识别的条件分支指令,它可以推测在分支和它的目标并获取从预测目标位置的指令。 但尽管如此,指令也可以按顺序执行。 但是,请注意,一旦猜测有条件分支指令与从预测路径(或两条路径)获取的指令到达问题阶段,没有人会发出直到所有较早的指令退休。 当发生这种情况时,处理器会知道该预测是否正确否则冲洗管道。
设计为执行简单的任务和在嵌入式系统或设备的IoT使用的处理器典型地是既不投机也不OOO。 台式机和服务器处理器都是投机性和OOO。 在计算领域(移动电话和微控制器)的中间, 你可以找到那些OOO处理器,而不是投机(如ARM的Cortex-A9 )。 英特尔邦内尔微架构是投机性的,但有序 。 与OOO当用于推测执行是特别有益的。
当我读崩溃和幽灵的论文和做更多的研究的混乱来了。 它在消融是基于乱序执行的消融纸规定,而其他一些资源,包括约sepeculative执行状态维基页面消融是基于推测执行。
如在论文中描述的消融漏洞需要既投机和乱序执行 。 然而,这是一个有些模糊的说法,因为有许多不同的投机和乱序执行的实现。 危机并不仅仅用任何类型OOO或投机的执行工作。 例如, ARM11 (在树莓派使用)支持一些有限OOO和推测执行,但它不容易。
见彼得对垮塌更多的细节和他的其他答案的答案 。
相关阅读: 什么是超标量和OOO执行之间的区别? 。
我仍然有很难搞清楚,熔化如何使用推测执行。 在本文的例子(这里我前面提到的相同)使用IMO仅OOO - @Name在评论
危机是基于Intel CPU的乐观猜测 ,负荷将没有过错,而且,如果断裂负荷达到负载端口,这是较早的分支预测失败的结果。 所以负载UOP被标记,以便如果达到退休,但继续执行推测使用的数据页表项说你不能从用户空间读它会发生故障。
相反,触发代价高昂的异常恢复负载执行时,就等待,直到它达到一定退休,因为这是为机械处理分支小姐一种廉价的方式 - >坏的负载情况。 在硬件上,它更容易为管道,以保持管道,除非你需要它停止/失速的正确性。 例如,那里没有页表项可言,因而TLB错过,必须等待负载。 但在TLB 命中 (对于该块使用它权限的条目)甚至在等待将增加复杂性。 通常一个页面故障失败后,页面走(不找到虚拟地址的条目)只提出过,或者在失败的TLB入口它击中的权限加载或存储的退休。
在一个现代化的流水线OOO CPU, 所有的指令都被视为投机,直到退休 。 只有在退休后做的指令成为非投机。 乱序机器并不知道也不关心它无论是猜测下所预测,但还没有执行,或者投机过去的潜在故障装入一个分支的一侧。 “投机”加载没有过错或ALU指令不引起异常的发生,即使在那些没有真正考虑投机的CPU ,但完全乱序执行原来那逼到另一种猜测。
我不是太担心了“推测执行”的确切定义,什么计数/什么不。 我更感兴趣的是乱序的设计很现代的实际工作,而它实际上是简单甚至没有试图从非投机性的区分投机直到管道的末端。 这个答案甚至没有试图解决简单的顺序管线投机取指(基于分支预测),但不执行,或者在和之间的任何地方全面的Tomasulo的算法与ROB +调度与OOO EXEC +中精确异常阶退休。
例如,只有退休后可以在商店曾经从存储缓冲L1D缓存,而不是之前提交。 并吸收短群和高速缓存未命中,它不具备要么发生,因为退休的一部分。 所以唯一的非投机性乱序的事情之一就是犯店L1D; 他们肯定是尽可能的架构状态来说事,所以他们如果中断/异常恰巧就算完成了。
该故障如果深远的退休机制,以避免在分支错误预测的影子昂贵的工作的好方法。 这也给了CPU正确的体系结构状态(寄存器值等),如果异常不火。 你需要的是你是否让OOO机械不断翻腾上超越你到哪儿去检测异常的浮点指令。
科失误是特殊的 :有上分支缓存该记录微 -建筑状态(如寄存器分配),所以分支恢复可回滚到代替冲洗管道,并从最后已知的良好状态退休重启的。 分行做错误预测在实际代码中有相当。 其他的例外情况是非常罕见的。
现代高性能CPU可以保持(乱序)从一个分支小姐之前执行微指令,而从该点之后丢弃微操作,并将执行结果。 快速恢复是不是丢弃并重新启动一切从那可能远在错误预测被发现的点之后退休状态便宜不少。
例如,在一个循环中,处理循环计数器说明可能会远远领先于环体的其余部分,特别是如果,检测到错误预测在年底足够很快前端重定向,也许不会失去太多实际吞吐量瓶颈是一个依赖链或大于UOP吞吐量以外的东西的等待时间。
这种优化的恢复机制仅用于分支(因为状态快照缓冲区是有限的),这就是为什么相比于全管道刷新分支失误也相对便宜。 (如英特尔,内存排序机清除,性能计数器machine_clears.memory_ordering
: ?什么是超兄弟姐妹与非超兄弟姐妹之间的存储位置的生产者-消费者共享的延迟和吞吐量的成本 )
例外的是不是闻所未闻的,虽然, 页面错误确实发生在正常的操作过程。 例如商店只读页面触发写入时复制。 加载或存储到一个未映射页面触发页面或处理懒惰的映射。 但数千到数百万指令通常每缺页之间即使在公司经常分配新的内存中的进程中运行。 (1每微或毫第二1GHz的CPU上)。 在代码,不映射新的内存,你可以走多远再没有例外。 大多只是一个计时器偶尔中断纯数字,没有I / O运算。
但无论如何,你不想,直到你确信一个异常将真火引发管道冲洗或什么都贵。 而且你确定你有正确的例外。 比如,也许加载地址为早期断裂负荷还没有准备好尽快,所以执行第一断裂负荷是不按程序顺序的第一位。 等到退休是一种廉价的方式来获得精确的例外。 额外的晶体管,廉价的条款来处理这种情况,并让往常一样,为了退休机械弄清楚到底是哪种异常火灾快。
做标记为故障退休的指令后执行指令的无用功电力成本一点点,而不是堵的价值,因为异常是如此罕见。
这就解释了为什么是有意义的设计,这是脆弱的摆在首位熔毁的硬件。 显然,这是不是安全继续这样做,现在消融已经想到了。
我们并不需要阻止断裂负荷后推测执行; 我们只需要确保它不实际使用敏感数据。 这不加载成功推测这就是问题所在,危机应该使用该数据产生依赖数据的微体系结构的影响基于以下说明。 (例如触摸基于该数据的高速缓存行)。
因此,如果负载端口屏蔽加载的数据为零或东西,以及设置故障的退休标志,将继续执行,但不能获得有关秘密数据的任何信息。 这应该采取的关键路径,这可能是有可能在装载口而不限制时钟速度或添加延迟的额外的周期的约1额外门延迟。 (1个时钟周期是足够长的逻辑通过一个流水线级内的许多AND / OR门,例如一完整的64位加法器传播)。
相关:我建议同一机制HW在固定的消融为什么AMD处理器没有/较少受到危机和幽灵? 。