- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道无序超标量处理器(假设是Intel i7处理器)每个周期获取的指令数是否恒定,或者是否可能根据缓存未命中率或分支未命中预测数而变化。给定的代码/程序?
如果不是常数,如何解释其背后的原因?如我所知,在现代多核处理器中,解码器单元始终尝试解决依赖关系,并尝试用独立的指令填充流水线气泡。因此,对于任何给定的工作负载,提取的指令数应该不总是相同(大约)吗?
最佳答案
给定周期获取的指令数量取决于多个因素。对于Intel的第四代Core处理器,当使用指令缓存而不是µop缓存时,每个周期都会获取对齐的16字节指令块。从该块中最多可以解析六个指令并将其放置在一个指令队列中(该指令队列可以从一个线程容纳多达20条指令)。如果可以融合两个指令(又称为宏操作),则该队列中最多可以解码五个指令,第一个指令解码为不超过四个融合微指令,其余三个指令解码为单个融合微指令。产生的微指令存储在56个条目的微指令解码队列中(也用作循环缓冲区)。 (解码成四个以上微指令的指令使用特殊的微码引擎。)
由于x86具有可变长度的指令(最多15个字节长),因此16字节块中的指令数量可以变化。另外,在采用分支的情况下,分支的目标可能无法与16字节的块对齐,并且分支指令可能不会在块的最后一个字节处结束。这意味着将忽略具有未对齐的采用分支目标的块开头的字节,并且将忽略采用分支之后的块中的字节。
(在其他一些微体系结构中,采用分支可能会导致一个周期,在该周期中不会提取(有用的)指令。如果分支目标缓冲区和指令高速缓存具有两个周期等待时间,则在采用分支上,分支指令开始执行后的周期会变为被提取将没有目标可用于提取以下指令。)
如果存在指令高速缓存未命中,则无法从该线程中获取指令,直到丢失的高速缓存行可用为止。同样,必须先处理TLB未命中,然后才能从指令高速缓存中进行进一步的提取。
µop缓存对每个周期获取的指令数量有不同的限制。每个周期可以从µop缓存中读取四个µop。这可以对应于一条指令或(具有宏运算融合功能)多于四条指令。由于实际上已对µop高速缓存进行了寻址,因此TLB未命中不会使读取停顿(尽管在µop高速缓存命中的情况下TLB未命中的可能性很小)。
(每个周期中有四个µop可以从µop解码队列移至60个条目的调度程序。)
由于分支预测错误,由于刷新了流水线,因此分支之后获取的所有指令都不会影响获取的有效指令的数量。虽然将在检测到分支预测错误之前提取指令(并可能执行一些指令),但它们不会对提交的指令数量有所贡献。
另外,指令的缓冲量有限。如果依赖于具有数据高速缓存的负载的µop错过了调度缓冲区,则可以将其填满,这将导致指令堆积在µop Decode Queue中(因为该队列将不再被清空),然后紧接在提取之后的指令队列将迅速填充,因为它无法排入µop解码队列。
重排序缓冲区(ROB)对离开µop解码队列的指令设置了另一个限制;当ROB已满时,不能再将更多指令移入调度缓冲区。即使最旧的指令尚未完成,即使以下所有191条指令都已完成并准备提交,也会发生这种情况。
即使没有数据高速缓存未命中,操作之间的依存关系也可能导致缓冲区填满,从而导致指令提取停顿。
您可能会猜到,拥有第二个线程可以通过减少分支预测的影响(实际上只有一半的指令从流水线中清除)并提供更多的指令级并行性(因为来自不同线程的指令将减少分支预测的影响)来提高更高的有效指令提取率。是独立的),这允许操作执行并最终提交,从而耗尽各种缓冲区。
由于存在如此大量的指令缓冲,并且大多数软件不能始终如一地充分利用执行宽度,因此取回每个周期可能执行的尽可能多的指令的压力较小。高质量的分支预测还意味着实际上将使用更多提取的指令。 (在分支预测错误的情况下,较宽的访存将更快地填满调度缓冲区,从而增加独立操作可用的机会。由于多个线程增加了可用的指令级并行度,因此也为更广泛的访存提供了动力,但是降低了抵制该奖励的获取停顿的频率和成本。)
关于cpu - 对于乱序的超标量处理器,每个周期获取的指令数是否恒定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282452/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!