Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cpu 分支预测器和分支目标缓冲区如何共存?_Cpu_Cpu Architecture_Branch Prediction - Fatal编程技术网

Cpu 分支预测器和分支目标缓冲区如何共存?

Cpu 分支预测器和分支目标缓冲区如何共存?,cpu,cpu-architecture,branch-prediction,Cpu,Cpu Architecture,Branch Prediction,我的问题是,在现代CPU体系结构中,它们是如何共存和协同工作的?你的想法稍微颠倒了一下。每次提取时,您都会将索引编入分支预测器,该预测器会告诉您刚刚收到的指令是否会被解码为已执行的分支。如果不是,则获取下一个顺序地址。但是,如果分支预测器说它将是一个已执行的分支,那么您不知道下一步获取哪个指令,因为您还没有解码该指令。因此,为了不浪费等待分支解析的周期,您可以使用分支目标缓冲区(或BTB)。BTB存储分支重定向控制流的以前地址。使用此机制,您试图预测控制流这次将重定向到何处。这种技术对于无条件分

我的问题是,在现代CPU体系结构中,它们是如何共存和协同工作的?

你的想法稍微颠倒了一下。每次提取时,您都会将索引编入分支预测器,该预测器会告诉您刚刚收到的指令是否会被解码为已执行的分支。如果不是,则获取下一个顺序地址。但是,如果分支预测器说它将是一个已执行的分支,那么您不知道下一步获取哪个指令,因为您还没有解码该指令。因此,为了不浪费等待分支解析的周期,您可以使用分支目标缓冲区(或BTB)。BTB存储分支重定向控制流的以前地址。使用此机制,您试图预测控制流这次将重定向到何处。这种技术对于无条件分支、函数调用和与返回地址堆栈配对时的返回具有100%的成功率。在条件分支上,成功率稍低,但考虑到分支目标的高时间局部性,仍然非常好。举个例子,你可以考虑一个循环的反向分支,它总是分支到同一个位置。 实际解析分支指令时(通常在管道的解码或执行阶段,取决于实现),您将调整分支预测器和BTB中的值,以便为将来的预测提供更多最新信息

以下是BTB查找和更新的图示说明:


你把它稍微颠倒了一下。每次提取时,您都会将索引编入分支预测器,该预测器会告诉您刚刚收到的指令是否会被解码为已执行的分支。如果不是,则获取下一个顺序地址。但是,如果分支预测器说它将是一个已执行的分支,那么您不知道下一步获取哪个指令,因为您还没有解码该指令。因此,为了不浪费等待分支解析的周期,您可以使用分支目标缓冲区(或BTB)。BTB存储分支重定向控制流的以前地址。使用此机制,您试图预测控制流这次将重定向到何处。这种技术对于无条件分支、函数调用和与返回地址堆栈配对时的返回具有100%的成功率。在条件分支上,成功率稍低,但考虑到分支目标的高时间局部性,仍然非常好。举个例子,你可以考虑一个循环的反向分支,它总是分支到同一个位置。 实际解析分支指令时(通常在管道的解码或执行阶段,取决于实现),您将调整分支预测器和BTB中的值,以便为将来的预测提供更多最新信息

以下是BTB查找和更新的图示说明:


他们为什么要互相干涉?第一个告诉你是否在条件分支上跳转,第二个告诉你在哪里跳转(在间接分支上)@Leeor,但我认为BTB用于从I$获取的每条指令。一旦命中,就不需要进行分支预测,我们可以继续在BTB的PC上获取指令。如果是失误,分支预测器将发挥作用并预测分支的结果。鉴于BTB的命中率超过90%,所以很少使用分支预测器。。。我哪里错了?如果分支预测器说您应该预测分支被执行,您只想使用BTB中的值。例如,如果分支仅针对分支历史表的某些值进行预测(对于两级自适应预测器)。@Danny谢谢!我认为现在更有意义了。他们为什么要互相干涉呢?第一个告诉你是否在条件分支上跳转,第二个告诉你在哪里跳转(在间接分支上)@Leeor,但我认为BTB用于从I$获取的每条指令。一旦命中,就不需要进行分支预测,我们可以继续在BTB的PC上获取指令。如果是失误,分支预测器将发挥作用并预测分支的结果。鉴于BTB的命中率超过90%,所以很少使用分支预测器。。。我哪里错了?如果分支预测器说您应该预测分支被执行,您只想使用BTB中的值。例如,如果分支仅针对分支历史表的某些值进行预测(对于两级自适应预测器)。@Danny谢谢!我认为现在更有意义了。+1当然,真正的实现可能更复杂。例如,BTB可能未标记或使用部分标记,因此存在将目标预测应用于不同分支的可能性(因此即使是无条件直接跳转也可能导致其目标预测失误)。作为目标预测的缓存,即使使用完整标记,也有可能出现容量和冲突(假设它不是完全关联的)未命中。具有多个目标的间接非返回跳跃也可能导致预测失误。甚至RAS也可能在溢出、上下文切换、分支错误计算等方面失败。我有几个Q。1) 由于间接分支具有更多可能的返回地址,因此在预测条件分支和间接分支之间,预测器如何变化?2) 不是先查看BTB,看看指令是否是一个分支(决定转到预测器)?3) 在解码阶段可以检测到哪种类型的分支预测失误?(我知道执行阶段实现)回答得好!我认为可能有一个输入错误:“在无条件分支上”->“在条件分支上”。+1当然,真正的实现可能更复杂。例如,BTB可能未标记或使用部分ta