我正在处理一个有6个阶段的管道:F D I X0 X1 W。有人问我当分支未命中预测发生时需要杀死多少指令。
我想出了4个。我认为这是因为分支解析发生在X1中,我们需要终止分支之后的所有指令。在管道图中,似乎需要终止正在流经管道的4条指令。对吗?
我还被问到如果管道是一个三宽的超标量,需要杀死多少个。这个我不确定。我认为应该是12个,因为您一次可以获取3条指令。对吗?
删除分支后的所有指令
如果这是真正的MIPS,则不会。MIPS有一个分支延迟槽:无论是否执行分支,分支后的指令总是执行。(jal的返回地址是延迟槽的末尾,因此它不会执行两次。)
这足以完全隐藏经典MIPS I(R2000)上的1周期分支延迟,它使用标量经典RISC 5级管道。它通过从EX时钟周期的前半部分转发到从时钟周期的后半部分开始的IF来管理1周期分支延迟。这就是为什么MIPS分支条件都是“简单的”(不需要通过整个单词进行进位传播),例如两个寄存器之间的
beq
,但只有一个操作数bgez
/bltz
与隐式0
进行有符号2的补码比较。这只需要检查符号位。
如果您的管道设计得很好,那么您会期望它在X0之后解析分支,因为MIPS ISA已经被限制为使ALU易于做出低延迟分支决策。但很明显,您的管道没有得到优化,分支决策直到X1结束时才准备就绪,无法让它运行MIPS代码而不是RISC-V或任何其他RISC指令集。
我想到了4。我认为这是因为分支解析发生在X1中,我们需要杀死分支之后的所有指令。
我认为4个周期适合于没有分支延迟槽的通用标量管道。
在X1周期结束时,前4个管道阶段中的每一个都有一条指令,等待在该时钟边缘移动到下一个阶段。(假设没有其他管道气泡)。延迟槽指令就是其中之一,不需要被杀死。
(除非有I-cache未命中获取延迟槽指令,否则延迟槽指令可能还没有在管道中。所以它不像杀死X0之前的3个阶段那么简单,甚至不像杀死管道中除了最旧的先前指令之外的所有指令那么简单。延迟槽不能自由实现,也使异常处理复杂化。)
So 0。。3条指令需要在从F到I的管道阶段中终止。(如果延迟槽指令可能在其中一个阶段中,您必须检测到这种特殊情况。如果不是,例如,I-cache未命中延迟足够长,它要么在X0中,要么仍在等待提取,那么管道可以终止前3个阶段,并根据X0是否为气泡来执行某些操作。)
我想应该是12条,因为你一次可以拿到3条指令
不可以。请记住,分支本身是可以通过管道的一组3条指令之一。在predict not take的情况下,解码阶段可能会将该获取/解码组中的所有3条指令发送到管道中。
我认为最糟糕的情况是,分支是组中的第一条(程序顺序中最旧的)指令。然后,必须终止X1中该组的1条(或2条没有分支延迟槽的)指令,以及前一阶段的所有指令。然后(假设没有气泡),您将取消13条(或14条)指令,每个前一阶段中有3条。
最好的情况是分支在一组3中是最后一个(程序顺序中最年轻的)。然后您将丢弃11个(或12个没有延迟槽)。
因此,对于没有延迟槽的3宽版本的管道,根据之前管道阶段中的气泡,您将杀死已经在管道中的0...14条指令。
实施延迟时隙吸盘;新的ISA不公开管道细节是有原因的。长期痛苦换取短期收益。
我需要计算表示为多个热向量的标签和预测的混淆矩阵。sklearn似乎不支持这种情况。 这是我所拥有的一个例子。假设有三个类,和;目标/标签为: 因此,我们有标签矩阵: 预测是: 预测矩阵为: 我希望输出是一个混淆矩阵,大致如下所示: 我使用来估计分类精度。然而,尽管正在为此类标签的准确性而工作,但混淆矩阵不支持上述场景。是否有任何替代? 另一个问题似乎给出了三个混淆矩阵,这不是我要寻找的情况。
●字段类型和逻辑条件有对应关系,如文本类型不会出现大于小于的判断。 ●预警范围:想要进行预警的图层。 ●预警方式: 高亮闪烁、语音提醒、弹窗提醒。 注意事项: ●一个地图可以设置最多30个预警项 ●预警范围覆盖点线面的属性内容,暂不包含动态预警 ●消息提醒为临时一次性提醒,重新刷新页面消息重新出现 [查看原图]
我在copris v.1.1中使用Akari求解器 这是scalademoapp.scala代码: 尝试执行求解器时会引发此异常: 线程“main”java中出现异常。lang.RuntimeException:目标变量未在jp定义。神户杯。糖解算器。findOptBody(Sugar.scala:631)在jp。神户杯。AbstractSolver$$anonfun$findOpt$1。在jp处
我有一个应用程序与许多不同的文档类型。每种类型都有自己的语料库,我不希望它们会相互影响。 例如,如果一种类型包含许多项X的出现,那么我不希望这会降低其他类型中X的IDF得分。 我还没有选择任何搜索引擎实现,所以我将欣赏Elasticsearch和/或Solr的答案。
我正在迁移一些JSP文件到Thymeleaf,我发现了以下问题。在原始的JSP代码中,有一个包含在许多其他JSP文件中的文件,其行如下: 在包含此变量的文件中,变量的使用方式如下: 设置同时在所有位置使用的多个属性。这里的要点是,您在一个文件中设置了,其值在所有其他文件中使用。如果需要更改属性的值,则只需更改一个文件。 为了在Thymeleaf中复制这一点,我尝试以下列方式使用属性。首先,我在模型
想象一个超标量(多个执行单元)并且还支持超线程(SMT)的CPU(或内核)。 为什么CPU可以真正并行执行的软件线程数通常由它拥有的逻辑内核(即所谓的硬件线程)的数量给出,而不是它拥有的执行单元总数? 如果我的理解是正确的,SMT实际上并没有实现真正的并行执行,它只是通过复制CPU的某些部分(存储架构状态的部分,但不是主要执行资源)来使上下文切换更快/更有效。另一方面,超标量架构允许每个时钟周期真