管道分支惩罚是ALU和IF之间非零距离的结果。
这句话是什么意思?
这意味着,在处理器的周期之间有惩罚。每个处理器都有操作周期,周期中的每个延迟都会导致惩罚,因为它会等待分支在ALU中执行,或者:
管道分支惩罚是ALU和IF之间非零距离的结果。
有一本很棒但很长的书叫做《计算机体系结构流水线和并行处理器设计》。
它详细解释了这个问题。
如果没有(正确的)分支预测,fetch不知道下一步要获取什么,直到ALU决定条件或间接分支的方向。因此它会暂停,直到分支在ALU中执行。
或者,如果预测不正确,则从错误路径获取/解码的指令无效,因此我们称之为分支预测失误惩罚;分支预测在正常情况下会隐藏它。
另一个术语是“分支延迟”——从获取分支指令到前端获取有用的下一条指令的周期数。
请注意,即使是无条件分支也有分支延迟:一条指令是一条分支的事实直到解码后才知道。这在管道中比执行更早,因此可能的惩罚小于条件或间接分支。
例如,在第一代MIPS R2000(经典的5级RISC)中,条件分支在EX阶段只需要半个周期,IF直到时钟周期的后半部分才需要地址,因此总分支延迟保持为1个周期。MIPS用分支延迟槽隐藏了该延迟:分支后的指令总是执行,无论它是否占用了分支。(包括无条件直接分支;ID阶段可以自行产生目标地址。)后来更深入流水线的MIPS CPU(尤其是超标量和/或乱序)确实需要分支预测,延迟槽无法完全隐藏分支延迟。
问题内容: 在Eclipse下开发Java应用程序时,我收到有关“通过综合方法访问方法/值”的警告。解决方案只是将私有访问修饰符更改为默认级别。 这让我想知道:使用合成方法会受到什么惩罚?有一些?我认为编译器/ Eclipse会发出警告,但是它是否如此相关或可以安全地忽略? 我在这里没有看到这些信息,所以我问。 问题答案: Eclipse警告您,您可能会公开您认为是私有的信息。如下所示,恶意代码可
在入门篇我们简单地讲解了Git的基本使用方法。在高级篇呢,我们首先要讲解一下分支的使用方法和操作。 在开发软件时,可能有多人同时为同一个软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。 所幸,Git的分支功能可以支持同时进行多个功能的开发和版本管理。 什么是分支? 分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以
什么是分支? 假设你的工作是维护本公司一个部门的手册文档,一天,另一个部门问你要相同的手册,但一些地方会有“区别”,因为他们有不同的需要。 这种情况下你会怎样做?显而易见的方法是:作一个版本的拷贝,然后分别维护两个版本,只要任何一个部门告诉要做一些小修改,你必须选择在对应的版本进行更改。 你也许希望在两个版本同时作修改,举个例子,你在第一个版本发现了一个拼写错误,很显然这个错误也会出现在第二个版本
问题内容: 我看过布兰登·罗德斯(Brandon Rhodes)关于Cython的谈话-“ EXE的日子即将到来”。 布兰登在09:30提到对于一段特定的短代码,跳过解释可以使速度提高40%,而跳过分配和分配可以使速度提高574%(10:10)。 我的问题是-如何测量特定代码段?是否需要手动提取基础的c命令,然后以某种方式使运行时运行它们? 这是一个非常有趣的观察,但是如何重新创建实验? 问题答案
我不明白JMH结果的分数属性?我也没在网上找到任何关于它的东西。 有人能告诉我,这是关于什么的吗?据我所知,高分比低分好,但这到底是什么意思,是如何计算的?
我使用的OptaPlanner有两个规划变量,其中一个定义为nullable=true。遵循会议示例(为简单起见),假设Room可以为空,但Time不能为空。 我在非空的变量上定义了一个约束,但似乎只有当可空的变量不为空时,惩罚才起作用,否则会失败。 下面是我的代码片段: 在我的约束提供者类中,我定义了以下约束来确保一个人不能参加两个单独的会议: 当创建两个具有非空值的对象时,如果假设同一个人同时