问题标签 [branch-prediction]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 分支预测不起作用吗?
关于这个问题,答案指定未排序的数组需要更多时间,因为它未能通过分支预测测试。但是如果我们在程序中做一个小的改动:
在这里我已经替换(来自原始问题)
和
未排序的数组给出了大约。同样的结果,我想问为什么分支预测在这种情况下不起作用?
c++ - 分支预测与分支目标预测
我是否理解对了,if
语句更依赖于分支预测,而 v-table 查找更依赖于分支目标预测?关于v-tables,没有“分支预测”,只有目标预测?
试图了解 CPU 是如何处理 v-table 的。
gcc - 您可以将 builtin_expect 与 switch 语句一起使用吗
我switch
在一些时间关键的代码中有一个声明。我试图用 优化它__builtin_expect
,但它似乎不起作用。我想知道是否有人可以告诉我我是否遗漏了一些细节,或者编译器是否根本没有针对它进行优化。我在我的主机上尝试了以下操作:
然后我编译并运行如下:
我正在使用 GCC 版本 4.5.1。
x86 - 分支预测器单元的输入?
我在这里查看幻灯片 13:
http://research.engineering.wustl.edu/~songtian/pdf/intel-haswell.pdf
(它应该显示 Haswell 的大框图)
在顶部它有一个名为“分支预测器”的块,有两个箭头出来。我有点不确定这里流程的正确顺序是什么?首先,“分支预测器”块没有任何输入?!
有人可以尝试解释(使用图表)分支预测器如何与其他元素交互吗?
此外,图中的哪些元素将与分支目标(预测器)缓冲区接口?会不会是从分支预测器中箭头出来的相同的两个(橙色和紫色)?
c++ - 分支预测和分支目标预测之间的性能差异?
我正在编写一些音频代码,基本上所有内容都是一个小循环。据我了解,分支预测失败是一个足够大的性能问题,我很难保持代码分支自由。但我只能到此为止,这让我想知道不同种类的分支。
在 c++ 中,条件分支到固定目标:
并且(如果我正确理解了这个问题),无条件分支到变量目标:
有性能差异吗?在我看来,如果这两种方法中的一种明显比另一种更快,编译器会简单地转换代码以匹配。
对于那些分支预测非常重要的情况,了解哪些有关性能的细节是有用的?
编辑: 的实际操作x : 10 ? 20
仅仅是一个占位符。分支之后的实际操作至少足够复杂,以至于两者都做是低效的。此外,如果我有足够的信息可以明智地使用__builtin_expect
,那么在这种情况下,分支预测将不是问题。
x86 - 分支目标预测与分支预测相结合?
编辑:我的困惑出现了,因为肯定通过预测采用哪个分支,您也在有效地进行目标预测??
这个问题与我关于该主题的第一个问题有内在联系:
查看接受的答案:
无条件分支,固定目标
- 无限循环
goto
陈述break
或continue
声明- 语句的“then”子句结束
if/else
(跳过该else
子句)- 非虚函数调用
无条件分支,可变目标
- 从函数返回
- 虚函数调用
- 函数指针调用
switch
语句(如果编译成跳转表)条件分支,固定目标
if
陈述switch
语句(如果编译成一系列if/else
语句)- 循环条件测试
- 和运算
&&
符||
- 三元
?:
运算符条件分支,可变目标
- 在正常情况下不太可能出现,但编译器可能会合成一个作为优化,结合上述两种情况。例如,在 x86 上,编译器可能会将代码优化
if (condition) { obj->VirtualFunctionCall(); }
为条件间接跳转,就像jne *%eax
由于尾调用优化而出现在函数末尾一样。
如果我有以下代码:
(BP =“分支预测”和 BTP =“分支目标预测”)
其非常明显的 BP 用于评估条件something
. 但是,我试图了解 BTP 是否也参与确定分支中发生的情况a
。BTP 是否也会根据 BP 的结果确定位于分支a
/的代码的地址?b
我在这个维基百科页面(http://en.wikipedia.org/wiki/Branch_target_predictor)上询问:
在计算机体系结构中,分支目标预测器是处理器的一部分,它在处理器的执行单元计算分支指令的目标之前预测所采用的条件分支或无条件分支指令的目标。
它建议在条件预测后使用 BTP 来预测目标。
1)有人可以澄清一下吗?
第二个相关问题 - BP 和 BTP 在与 CPU 的 fetch/decode/execute/write-back 管道交互的方式上有何不同?BP 是否从获取或解码阶段开始?在条件代码的执行阶段之后,我们可以检查预测是否正确并更新分支预测缓存。
2) BTP 在获取/解码/执行/写回 CPU 阶段如何工作?
c - 避免 IF ELSE 分支
我在看分支,我想避免循环分支,这基本上就是这样做的
所以我的计划实际上是用以下内容替换它:
但是,这行不通,我明白为什么,但想知道是否有另一种方法可以做到这一点,以类似的方式。
谢谢
c++ - 侵入式、循环、无分支、双向链表——如何有列表来识别节点成员字段?
代码发布在这里:https ://ideone.com/ul2PiS
我想要做的是允许用户将列表节点指定为将添加到列表中的类的成员字段。目前,这是通过使用 offsetof() 的宏来完成的,这意味着成员节点必须是公共的。理想情况下,我希望能够以某种方式指定,作为每个linked_list 声明的一部分,作为模板参数,哪个成员字段应该用作节点。boost::intrusive似乎可以管理它,但我不太明白他们是如何做到的。
要求列表函数是无分支的(没有指针比较,平台具有非常非常慢的分支机制)并且列表是侵入性的并且允许对象同时成为多个列表的成员。
客户端代码如下所示:
[编辑] 好的,使用指向成员模板参数的指针会更好:
因此您可以声明如下列表:
所以我们(大部分)摆脱了丑陋的声明语法,尽管我仍然找不到让它们成为私有的方法。看起来 boost::intrusive 也要求它们公开。
assembly - 多态性的代价
我正在查看 x86-64 中的以下虚拟方法调用:
还有 Agner Fog 的延迟表:
http://www.agner.org/optimize/instruction_tables.pdf
当我使用 Ivy Bridge CPU 时,我正在查看第 175 页。
我是否正确,前两个 MOV 指令都只需要 2 个(它们都是将内存移动到寄存器)CPU 周期?我认为对虚拟方法的调用比这慢?
在第 178 页的指令延迟表中,它说这个调用的延迟是 2 个 CPU 周期(我认为?)。与“r”(寄存器)和“m”(内存)
CALL
相反,“near”是什么意思?CALL
CALL
所以根据 Fog 手册,上面的 ASM 确实需要 6 个 CPU 周期,我没有误解任何东西吗?
编辑:我将虚函数调用更改为 vtable 中的第二个。
branch-prediction - 分支目标预测与分支预测
分支目标预测(BTP)与分支预测(BP)不同。我知道 BTP 会找到分支将跳转到的位置,而 BP 只是决定可能采用哪个分支。
BTP是否依赖于BP,如果BTP不使用BP来预测采用哪个分支,它怎么可能知道分支的目标?
我不明白为什么会有这么大的差异?一旦分支被预测为被采用,是不是找到目标就像读取指令中的地址一样简单?