X86 Haswell是双路径执行CPU吗?

X86 Haswell是双路径执行CPU吗?,x86,x86-64,intel,cpu-architecture,branch-prediction,X86,X86 64,Intel,Cpu Architecture,Branch Prediction,Haswell现在有2个分支单元-如下所示: 这是否意味着Haswell是双路径执行CPU 在以下方面: 这是否意味着Haswell只能在Integer ALU和Shift端口6上执行第二个分支,而不能在其他端口上的任何其他ALU上执行 不,哈斯韦尔仍然只是沿着预测的分支一侧进行推测 端口0上的分支单元只能执行预测的而不是执行的分支,如您从中所看到的。这加快了比较和分支的大链的执行,其中大部分都没有被执行。这在编译器生成的代码中并不少见 具体见大卫·坎特的哈斯韦尔著作。如果Haswell介绍了你

Haswell现在有2个分支单元-如下所示:

这是否意味着Haswell是双路径执行CPU

在以下方面:


这是否意味着Haswell只能在Integer ALU和Shift端口6上执行第二个分支,而不能在其他端口上的任何其他ALU上执行

不,哈斯韦尔仍然只是沿着预测的分支一侧进行推测

端口0上的分支单元只能执行预测的而不是执行的分支,如您从中所看到的。这加快了比较和分支的大链的执行,其中大部分都没有被执行。这在编译器生成的代码中并不少见

具体见大卫·坎特的哈斯韦尔著作。如果Haswell介绍了你链接的那篇文章中描述的功能,Kanter的文章会提到它,Intel的优化手册和Agner Fog的Microach pdf也会提到它。请参阅标记wiki以获取指向该标记和更多标记的链接

port6上整数/分支单元的一大优势是它不与任何向量执行端口共享。因此,一个循环可以有3个向量ALU UOP和一个分支,并且每个循环运行一次迭代。大卫·坎特(David Kanter)的著作也说了同样的话

这是否意味着Haswell只能在Integer ALU和Shift端口6上执行第二个分支,而不能在其他端口上的任何其他ALU上执行

如果该文件中的想法得以实现,它将影响整个管道,而不仅仅是执行分支的端口

双路径指令 处理DPIP被认为是一种简单的机制 获取、解码和重命名指令,但不执行 从低置信度预测分支的替代路径 与执行预测路径的时间相同


因此,实际上,备用路径不会涉及执行单元。这应该是显而易见的…

您不需要同时执行两条路径-考虑到通常平均每5条指令就有一条分支,这将很困难,因为您很快就会得到指数级的路径数。即使你只在难以预测的分支上像那样发散,你仍然可以得到大量的平行路径

添加第二个分支单元的原因要简单得多——在一个无序的机器中,即使计算一个预测的主执行路径,您仍然会得到大量正在运行的分支。请注意,预测是在管道开始时完成的,因此它与每个分支的实际执行和解析分离。实际上,前端将为机器提供分支,OOO机器需要尽快解决依赖关系并执行它们,因为您希望尽早解决预测,并在错误时恢复。我猜设计者们发现需要额外的执行带宽,因为可能存在这样的情况,即多个分支在程序顺序上甚至可能不连续,同时准备好它们的源,突然需要同时执行所有分支。因此,关于第二欧盟高分支机构代码的评论


除了相互冲突的分支之外,您还可以看到执行端口0还承载着许多其他类型的操作,因此您还可以让一个分支准备好执行,但由于其他非分支操作而暂停。因此,关于端口0冲突的另一条评论在理论上,他们可能只是将分支执行单元移动到另一个端口,但这会增加其他冲突,并且不会解决分支与分支之间的冲突。

谢谢!也就是说,分支[Port-6]仅用于一个循环可以有3个向量ALU UOP和一个分支,并且仍然以每个循环一次迭代的方式运行。?或者分支[Port-6]允许两个超线程线程在其他分支上运行?@Alex:Hyperreading与此无关。无序内核每个时钟只能使一个预测的执行分支失效。然而,分支预测在管道中发生得更早。此外,3个向量ALU UOP只是一个示例用例。port6可以运行简单的ALU操作,比如add,因此它们在Haswell上的吞吐量是每个时钟4个,而在IvB/SnB上是每个时钟3个。我不认为这个问题不太清楚,应该关闭它。它充满了误解,就像这个用户之前的一些问题一样,但并没有到无法回答的程度。我不得不猜测最后一段中的额外问题应该是什么。不过,如果像我在回答中那样包含论文摘要,那将是一个更好的问题,因为如果链接中断,这个问题将变得无法回答且毫无意义。Pre-Haswell CPU的分支单元位于端口5,因此,例如,FP重载代码可以使用FP mul使端口0/1饱和,并添加UOP,并使循环开销主要在p5上运行。关于更快发现预测失误的有趣点。我主要考虑的是重分支代码的分支吞吐量,而不是延迟。我不确定前端是否可以处理多个ta
每个时钟都有一个分支。uop缓存缓存跟踪,因此这是可能的。但如果不是,这就解释了为什么port0只处理预测的未执行分支:前端无论如何每个时钟只能支持一个执行的分支。或者,另一个原因可能是为了确保预测的执行循环分支不会窃取p0并降低向量ALU吞吐量。@PeterCordes,你所说的处理、预测或恢复是什么意思?我不确定前端是否可以或应该恢复多个分支,但并非所有执行的分支都会导致预测失误。如果是关于预测-前端和后端可能具有解耦的带宽-您可以预测每个周期1个分支,但仍然会在后端出现局部拥塞-例如,switchx将在生成x后准备执行任意数量的分支案例,不管前端将它们输入OOO机器需要多长时间。我的意思是,前端可以发出一组最多4个UOP,并且在同一周期内有两个预测的执行分支。这意味着在同一个周期内RIP会有两个额外的变化。IIRC,一个预测分支结束一个问题组。e、 g.6 uop循环最多每2个时钟运行一次迭代,而不是每1.5个时钟运行一次迭代。因为它会发出ABCD EF/ABCD EF。不是ABCD EFAB/CDEF。正如你提到的,我还猜测分支预测器可能每个周期只能生成一个预测。我不确定分支预测发生的确切时间。如果预测采用和预测未采用的uop可以位于环回缓冲区中,而无需重新预测,则应该可以持续发出4 uop外观,主体中有一个未采用的分支,最后有一个采用的分支。如果没有,那么未执行分支的额外执行能力对于您提到的情况可能最有用,在这种情况下,x直到几个分支发出之后才准备就绪。仅此一种情况就足以证明额外的分支单元是合理的。