branch-prediction相关内容

如果我们总是可以填充延迟时隙,那么就不需要分支预测了吗?

我正在研究H& P第三版的MIPS管道的五个阶段(ID,IF,EXE,MEM,WB)。在我看来,分支决定是在ID阶段解决的,因此当分支指令到达其EXE阶段时,分支之后的第二条指令可以正确执行(可以提取)。但这给我们留下了可能仍然在分支指令之后不久浪费第一条指令的问题。 我也遇到了分支延迟槽的概念,这意味着您要填充分支之后的第一条指令具有一些有用的信息,并且“无害”地表明是否按照需要执行了该指 ..
发布时间:2020-10-10 23:25:42 其他开发

CPU体系结构的演变如何影响虚拟函数调用性能?

几年前,我正在学习x86汇编程序,CPU流水线,缓存未命中,分支预测以及所有这些爵士乐。 这是一个两半的故事。我了解了冗长的流水线在处理器中的所有奇妙优点,即指令重排序,高速缓存预加载,依赖项交织等。 缺点是标准的任何偏差成本很高。例如,每当您通过指针(!)调用函数时,IIRC在千兆赫兹时代的某个AMD处理器都会受到 40个周期 的惩罚。 。 这不是一个微不足道的“不用担心”数字 ..

C#将bool重新解释为字节/整数(无分支)

在C#中是否有可能将 bool 转换为 byte 或 int (或者实际上是任何整数类型)没有分支? 换句话说,这不是 足够好: var myInt = myBool吗? 1:0; 我们可能会说我们想重新解释 bool 作为基础 byte ,最好使用尽可能少的指令。目的是避免分支预测失败,如此处。 解决方案 也许可行吗? (想法来源) 使用系统; ..
发布时间:2020-06-07 18:38:17 C#/.NET

分支预测如何与指令指针交互

据我了解,在处理器流水线的开头,提取后分支预测器会更新指令指针(指向要执行的下一条指令的地址),以便随后可以在该地址上获取该新地址。 但是,如果在管道的早期修改了指令指针,这不会影响当前可能依赖于旧指令的执行阶段中的指令指令指针值?例如,当执行调用时,当前EIP需要被推入堆栈,但是在分支预测期间更新指令指针时,这不会受到影响吗? 解决方案 您似乎假设整个CPU内核仅使用一个物理EIP ..
发布时间:2020-06-07 18:38:11 其他开发

分支预测错误

这个问题可能很愚蠢,但我还是会问。 我从这 Mysticial的答案 ,我想知道以下情况是否可能发生 说我有这段C ++代码 while(memoryAddress = getNextAddress()){ if(haveAccess(memoryAddress)) //更改* memoryAdrress的值 else // } 因此 ..
发布时间:2020-06-07 18:38:08 其他开发

为什么要预测一个分支,而不是简单地并行执行两个分支?

我相信,在创建CPU时,如果选择了错误的分支,分支预测会大大降低。那么为什么CPU设计人员为什么选择一个分支而不是简单地执行两个分支,然后在确定确定选择了哪个分支之后就切断它? 我意识到这只能在较短的指令内深入2或3个分支,否则并行阶段的数目会变得非常荒谬,因此在某些时候您仍然需要一些分支预测,因为您肯定会跨较大的分支运行,但不会几个阶段这样有意义吗?在我看来,这似乎可以大大加快处理速度,并 ..
发布时间:2020-06-07 18:38:06 其他开发

Haswell,Sandy Bridge,Ivy Bridge和Skylake的BTB大小是多少?

是否有任何方法可以确定Haswell,Sandy Bridge,Ivy Bridge和Skylake Intel处理器的分支目标缓冲区大小? 解决方案 由Agner Fog检查软件优化资源, http://www.agner.org/optimize/ BTB应该位于“ Intel,AMD和VIA CPU的微体系结构:汇编程序员和编译器制造商的优化指南”中, http://www.a ..
发布时间:2020-06-07 18:37:58 其他开发

即使对于很短的if语句主体,分支预测错误也会刷新整个管道吗?

我读过的所有内容似乎都表明分支预测错误总是导致整个管道被刷新,这意味着浪费了很多周期。我从没听过有人提到任何简短的if条件例外。 在某些情况下,这似乎真的很浪费。例如,假设您有一个独立的if语句,该语句具有非常简单的主体,可编译为1条CPU指令。如果一条子句将被一条指令编译成条件跳转。如果CPU预测分支不会被占用,它将开始执行if-body指令,并可以立即开始执行以下指令。现在,一旦对if- ..

为什么不仅仅预测两个分支?

CPU使用分支预测来加快代码的速度,但前提是实际使用了第一个分支。 为什么不简单地同时使用两个分支?就是说,假设两个分支都将被命中,缓存双方,并在必要时采用适当的分支。缓存不需要无效。虽然这要求编译器在动手之前加载两个分支(更多的内存,适当的布局等),但我认为适当的优化可以简化这两个分支,以便可以从单个预测变量获得接近最佳的结果。也就是说,一个人需要更多的内存来加载两个分支(这对N个分支而言 ..

使用英特尔最新分支记录的开销是多少?

最后分支记录是指寄存器对(MSR)的集合,这些寄存器对存储与最近执行的分支有关的源地址和目标地址。 http://css.csail.mit.edu/6.858/2012/readings/ ia32 / ia32-3b.pdf 文档提供了更多信息,以备您感兴趣。 a)有人可以提出一个想法吗? LBR多少会减慢普通程序的程序执行速度(CPU和IO密集型?)? b)当LBR跟踪打开时,分支预 ..
发布时间:2020-06-07 18:37:47 其他开发

在CPU仿真中使用切换案例时如何处理分支预测

我最近在这里阅读了此问题为什么 $ b并发现答案绝对令人着迷,并且在处理基于数据的分支时完全改变了我对编程的看法。 我目前有一个相当基本但是用C语言编写的功能完整的解释型Intel 8080 Emulator,该操作的核心是一个256长的开关柜表,用于处理每个操作码。我最初的想法是,这显然将是最快的工作方法,因为操作码编码在整个8080指令集中不一致,并且解码会增加很多复杂性,不一致和一次性 ..

了解分支预测

有些关于分支预测的查询我无法自信地弄清楚。假设我必须使用静态分支预测器。 分支预测应该在管道的哪个阶段发生? 如何知道预测出错了?数据路径如何得知发生了错误预测? 如果得知发生了错误的预测,它将如何发送信号占用未采用的分支? 之后出了错,我必须处理以前没有用的那个地址。同时,如果发生了某些存储器写或寄存器写怎么办?如何防止它发生? 即使某些适当的数据路径引用也将非常有帮助在他们建 ..
发布时间:2020-06-07 18:37:33 其他开发

Spectre(v2)的内部运作

我已经阅读了有关Spectre v2的一些文章,显然您会得到非技术性的解释。彼得·科德斯(Peter Cordes)有更深入的解释,但并未完全解决一些细节。注意:我从未进行过Spectre v2攻击,因此没有实际经验。我只读过有关该理论的文章。 我对Spectre v2的理解是,您对实例 if(输入。如果间接目标数组(我不太确定其详细信息,即为什么与BTB结构分开)(在解码时针对间接分支的R ..
发布时间:2020-06-07 18:37:30 其他开发

这些年来,英特尔为何改变静态分支预测机制?

从此处,我知道英特尔实现了几种静态分支预测这些年来的机制: 80486年龄:永远不被摄取 Pentium4年龄:后退/未前进 Ivy Bridge,Haswell等较新的CPU变得越来越无形,请参见马特·G的实验在这里。 英特尔似乎不想再谈论它了,因为我在英特尔文档中找到了最新资料是大约十年前写的。 我知道静态分支预测(远比动态)重要,但是在很多情况下,CPU会完全丢 ..

MSROM过程中的条件跳转指令?

这与此问题 考虑一下,在现代的Intel CPU上,SEC阶段以微代码实现,这意味着将进行检查,从而使用烧入的密钥来验证PEI ACM上的签名。如果不匹配,则需要执行某些操作;如果不匹配,则需要执行其他操作。鉴于这是作为MSROM过程实现的,因此必须有一种分支方式,但是鉴于MSROM指令没有RIP。 通常,当分支错误地预测了采用然后,当指令退出时,ROB将检查异常代码,并因此将指令长度 ..
发布时间:2020-06-07 18:37:23 其他开发

当Skylake CPU错误预测分支时会发生什么?

我试图详细了解当分支预测错误时在Skylake CPU管道的各个阶段中的指令会发生什么,以及从正确的分支目标开始执行指令的速度如何。 因此,我们在这里将两个代码路径分别标记为红色(预测但未实际采用)和绿色(预测但未实际采用)。这样的问题是: 1.在红色指令开始被丢弃之前,分支必须经过管道多远(以及在管道的哪个阶段被丢弃)? 2.绿色指令可以在多长时间内开始执行(根据分支所达到的流水线阶段 ..

repz ret:为什么所有麻烦?

repz ret 的问题已在此处[ 1 ]以及其他来源[ 2 , 3 ]非常令人满意。但是,在没有阅读这两个资料的情况下,我找到了以下答案: 什么是 actual >与 ret 或 nop进行定量比较的惩罚; ret ?尤其是在后一种情况下,当大多数函数具有100条以上指令或被内联时,解码一条额外的指令(然后是一条空指令!)真的有意义吗? 为什么这在AMD K8中从来没有得到解决,甚至 ..