branch-prediction相关内容

数据依赖与控制依赖的区别

我很难理解数据依赖和控件依赖之间的区别。 我看到的一个例子是: 数据依赖例如,指令使用另一条指令创建的数据 控制相关性例如,指令等待更新的注册表进行比较 我很难理解的是,例如在BEQ中,我等待寄存器更新,但我也依赖他的数据。 所以我不知道如何区分它们之间的区别。 推荐答案 指令等待更新注册表进行比较是对控制相关性的错误描述,难怪 条件分支指令本身对其 ..

英特尔:序列化指令和分支预测

The Intel Architecture's Developer's Manual(第三卷,第8-26节),内容为: 奔腾处理器和更新的处理器系列使用 分支预测技术,以通过预取 分支指令之前的分支指令的目的地为 被处死。因此,指令执行不是确定性的 在执行分支指令时序列化。 这是什么意思? 听起来真的,真的很糟糕。这听起来像是一条序列化指令,如CPUID中断分支预测(反之亦然) ..
发布时间:2022-05-08 20:44:48 其他开发

IF(A|B)总是比IF(A||B)快吗?

我正在阅读Fedor Pikus的this book,他有一些非常非常有趣的例子,对我来说是一个惊喜。 尤其是这个基准测试让我印象深刻,唯一的区别是,在其中一个基准测试中,我们在IF中使用||,在另一个基准测试中,我们使用|。 void BM_misspredict(benchmark::State& state) { std::srand(1); const unsig ..
发布时间:2022-04-20 14:41:22 C/C++开发

分支预测器如何知道它是否正确?

这是我第二次问这个问题;第一次有人回复了,但我花了很长时间才回复,因此没有得到充分的理解。 我试图做的是更多地了解现代体系结构的取指令部分;我假设所有指令都是由分支预测器预测的,以供取指令单元根据预测进行取。 另一位绅士试图帮助提到有关“分支指令”的内容,该指令也与预测指令一起发送。此“分支指令”测试分支预测器的预测是否正确的条件。我还假设这些分支指令进入分支执行单元,并且不需要从内存 ..
发布时间:2022-04-08 14:25:52 其他开发

为什么非寄存器跳转指令需要分支目标缓冲区?

对于MIPS 5级流水线,解码级知道分支目标,因为如果分支偏移量在指令中,并且您还读取解码级中的寄存器,则可以很容易地提取分支目标。 那么对于乱序流水线,很明显在使用‘jr’这样的指令时会遇到问题,这些指令可能会使用尚未计算的寄存器。对于这样的用途,分支目标缓冲区有明显的用法。 但是对于像‘beq’这样的指令,我认为有必要使用分支预测器,但不需要分支目标,因为您已经知道分支偏移量,当然也知 ..
发布时间:2022-03-27 20:45:55 其他开发

什么时候应该优先使用流而不是传统循环以获得最佳性能?流是否利用了分支预测?

我刚刚阅读了有关 Branch-Prediction 的文章,并想尝试一下它如何与 Java 8 Streams 一起工作. 但是,Streams 的性能总是比传统循环差. int totalSize = 32768;int 过滤器值 = 1280;int[] 数组 = 新的 int[totalSize];随机 rnd = 新随机(0);整数循环计数 = 10000;for (int i ..
发布时间:2022-01-22 10:15:20 Java开发

C# 将 bool 重新解释为 byte/int(无分支)

是否可以在 C# 中将 bool 转换为 byte 或 int(或任何整数类型,真的)无需分支? 换句话说,这不够: var myInt = myBool ?1:0; 我们可能会说我们想将 bool 重新解释为底层 byte,最好用尽可能少的指令.目的是避免分支预测失败,如 这里. 解决方案 unsafe{字节 myByte = *(byte*)&myBool;} 另一个选项是 ..
发布时间:2022-01-19 17:52:23 C#/.NET

这些年英特尔为什么要改变静态分支预测机制?

从这里我知道英特尔实现了几个静态分支预测这些年的机制: 80486 年龄:始终未采取 Pentium4 时代:Backwards Takes/Forwards Not-Taken Ivy Bridge、Haswell 等较新的 CPU 变得越来越无形,请参阅 Matt G 的实验在这里. 而且英特尔似乎不想再谈论它了,因为我在英特尔文档中找到的最新材料是大约十年前写的. ..

GCC 5.4.0 的昂贵跳跃

我有一个看起来像这样的函数(只显示重要的部分): double CompareShifted(const std::vector& l, const std::vector &curr, int shift, int shiftY) {...for(std::size_t i=std::max(0,-shift);i 这样写,这个函数在我的机器上用了大约 34 毫秒.将条件更改为 bool 乘 ..
发布时间:2022-01-06 13:10:48 C/C++开发

CPU 架构演变如何影响虚拟函数调用性能?

多年前,我正在学习 x86 汇编器、CPU 流水线、缓存未命中、分支预测和所有爵士乐. 这是一个分为两部分的故事.我阅读了处理器中冗长管道的所有奇妙优势,即指令重新排序、缓存预加载、依赖交错等. 缺点是任何偏离规范的代价都非常大.例如,IIRC 早期千兆赫时代的某个 AMD 处理器每次通过指针 (!) 调用函数时都会受到 40 个周期 惩罚,这显然是正常的. 这不是一个可以忽略的 ..

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

我试图详细了解当分支预测错误时,skylake CPU 管道各个阶段的指令会发生什么情况,以及来自正确分支目标的指令开始执行的速度. 所以让我们将这里的两个代码路径标记为红色(预测的,但未实际采用的)和绿色(采用的,但未预测的).所以问题是:1. 在红色指令开始被丢弃之前,分支必须通过流水线多远(以及它们在流水线的哪个阶段被丢弃)?2. 绿色指令多久可以开始执行(就分支到达的流水线阶段而言) ..

便携式分支预测提示

是否有任何可移植的方式进行分支预测提示?考虑以下示例: if (unlikely_condition) {/* ..一个.. */} 别的 {/* ..B.. */} 这与做有什么不同吗: if (!unlikely_condition) {/* ..B.. */} 别的 {/* ..一个.. */} 或者是使用编译器特定提示的唯一方法?(例如 GCC 上的 __builtin_exp ..
发布时间:2021-12-20 16:22:49 C/C++开发

X86 64 位模式下的索引分支开销

这是对之前线程中的一些评论的跟进: 递归斐波那契装配 以下代码片段计算斐波那契数,第一个示例带有循环,第二个示例带有计算跳转(索引分支)到展开的循环.这是在带有 Intel 3770K 3.5ghz 处理器的 Windows 7 Pro 64 位模式下使用 Visual Studio 2015 Desktop Express 进行测试的.通过 fib(0) 到 fib(93) 的单循环 ..

分支目标缓冲区检测到什么分支错误预测?

我目前正在研究可以检测分支预测错误的 CPU 管道的各个部分.我发现这些是: 分支目标缓冲区 (BPU CLEAR) 分支机构地址计算器(BA CLEAR) 跳转执行单元(不确定这里的信号名称??) 我知道 2 和 3 检测到什么,但我不明白 BTB 中检测到什么错误预测.BAC 检测 BTB 在哪里错误预测了非分支指令的分支,BTB 未能检测到分支,或者 BTB 错误预测了 x8 ..

x86-64 程序集的性能优化 - 对齐和分支预测

我目前正在编写一些 C99 标准库字符串函数的高度优化版本,例如 strlen()、memset() 等,使用 x86-64 汇编和SSE-2 说明. 到目前为止,我已经设法在性能方面取得了出色的结果,但是当我尝试进行更多优化时,有时会出现奇怪的行为. 例如,添加甚至删除一些简单的指令,或者简单地重新组织一些与跳转一起使用的局部标签,都会完全降低整体性能.并且在代码方面绝对没有理由. ..
发布时间:2021-12-18 08:59:42 其他开发

慢jmp-指令

随着我的问题在 x86-64 中使用 32 位寄存器/指令的优势,我开始衡量成本的指令.我知道这已经多次完成(例如 Agner Fog),但我正在做用于娱乐和自我教育. 我的测试代码非常简单(为了简单起见,这里是伪代码,实际上是汇编程序): for(outer_loop=0;outer_loop 但还是要考虑一些事情. 如果循环的内部部分很大(大NI>10^7),则循环的整个内容无 ..
发布时间:2021-12-18 08:42:29 其他开发

按概率排序 if...else if 语句的效果是什么?

具体来说,如果我有一系列 if...else if 语句,并且我以某种方式事先知道每个语句将评估为 的相对概率真的,按照概率顺序对它们进行排序在执行时间上有多大差异?例如,我应该更喜欢这个: if (highly_likely)//做一点事否则如果(有点可能)//做一点事否则如果(不太可能)//做一点事 到这个?: if(不太可能)//做一点事否则如果(有点可能)//做一点事否则如果(极有可 ..

是“IF"吗?昂贵的?

我这辈子都记不住老师那天说的话,我希望你可能知道. 模块是“数据结构和算法",他告诉我们一些大致如下: if 语句是最昂贵的[某物].[东西] 注册[东西]. 是的,我的记性确实很糟糕,我真的很抱歉,但我已经用谷歌搜索了几个小时,但没有任何结果.有什么想法吗? 解决方案 在最底层(在硬件中),是的,ifs 很昂贵.为了理解原因,您必须了解管道是如何工作的. 当前要执 ..
发布时间:2021-12-12 13:11:12 其他开发

为什么有条件的移动不容易受到分支预测失败的影响?

在阅读了这篇文章(StackOverflow 上的答案)(在优化部分)后,我想知道为什么条件移动是不容易受到分支预测失败的影响.我在 上找到了一篇关于条件移动的文章(PDF 由 AMD).同样在那里,他们声称 cond 的性能优势.移动.但这是为什么呢?我没有看到.在评估该 ASM 指令的那一刻,尚不知道前一条 CMP 指令的结果. 解决方案 错误预测的分支代价高昂 如果一切顺利的话 ..