问题标签 [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.
c - 当循环迭代次数不恒定时,分支预测器能否完美预测?
下面的代码会在假设 Intel Core i7 时产生分支错误预测惩罚吗?
计数可以是 0、1 或 2。
mips - 采用或未采用的分支序列,可降低分支误预测率
增加分支预测表的大小意味着程序中的两个分支不太可能共享一个公共预测器。预测单个分支指令的单个预测器通常比服务多个分支指令的相同预测器更准确。
列出已采取和未采取的一系列分支操作,以显示与情况相比降低分支误预测率的 2 位预测器共享(多个不同的分支指令映射到预测表的同一条目)的简单示例其中每个分支使用单独的预测器条目。(注意:一定要展示两个不同分支指令的结果,并具体标明这些结果的顺序和对应的分支)
有人可以向我解释这个问题具体要求什么吗?另外,“2位预测器共享(几个不同的分支指令映射到预测表的同一条目)”和“每个分支使用单独的预测器条目”是什么意思?我一直在阅读和重读我的笔记,但我无法弄清楚。我试图在网上找到一些分支预测示例,但没有找到。
assembly - 是 mov rax,0x12345678; jmp rax 仍然会杀死分支预测?
我无法找到上述两个案例的特定信息,尽管听取了您的专家意见。
第一件事是:我知道间接 jmp 会伤害分支预测,并且即使间接的结果是恒定的,它仍然需要预测维护缓冲区和东西,所有这些都与绝对 jmp 相比。
我的问题是,如果有人知道:
处理器的分支预测器仍然认为是间接的,或者在这种情况下它是否进行数学运算。我这样做是因为 x64 没有直接的“jmp absolute 64”指令,只有间接的。:/ ( How to execute a call instruction with a 64-bit absolute address?建议这个,如果你不能把跳转足够靠近目标并使用jmp rel32
。)
其次,在这个程度上,jmp 0x1234 和 call 0x1234 之间是否有任何真正的区别(在处理器优化方面(指令缓存、预取器及其提示、分支预测))?(vc2012“速度优化”产生调用,“min_size opt”产生jmp,“混合优化”产生x64的jmp,x86的调用)
c - f(x) 的无分支实现:= if x == 0 then 0 else (x * log(x))
我有这个 C 函数:
我在一个紧密的循环中调用它,并且想摆脱分支以查看它是否可以提高性能。
我不能使用这个:
因为它返回NaN
时x == 0
(大约 25% 的时间是正确的。)
有没有另一种方法来实现它,以便它在0
何时返回x == 0
,但仍然摆脱分支?
(我不太关心负输入,因为这些是错误,而零则不是。)
visual-studio - 将 profile-guided 编译报告到源代码
在这个问题中,我将关注 Visual Studio 2012 和 GCC 4.7
一方面,配置文件引导编译通过在运行时检测代码,然后在第二次编译期间使用此信息来优化分支预测。另一方面,许多编译器提供扩展来提示编译器最有可能采用哪个分支:GCC 提供__builtin_expect
,Visual Studio 提供__assume
.
有没有办法提取(任一编译器的)配置文件引导信息,以便能够使用两个编译器扩展重写代码?目标是为愿意重新编译他们自己的二进制版本的人们提供“优化”的源代码。
c++ - 另一个条件语句使程序更快
阅读为什么处理排序数组比处理未排序数组更快?,我在主循环中添加了一个额外的测试。似乎这个额外的测试使程序更快。
我得到大约 4.2 秒的附加测试和 18 秒没有附加测试。额外的测试不应该让程序变慢而不是让它变快吗?
x86 - 返回堆栈缓冲区?
据我了解,返回堆栈缓冲区仅支持 4 到 16 个条目(来自 wiki:http ://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_function_returns )并且不是键值对(基于 ret 指令的位置索引)。这是真的吗?当上下文切换发生时 RSB 会发生什么?
假设我们在返回堆栈缓冲区长度为 16 的 CPU 中处理了 50 个未返回的函数,之后会发生什么?这是否意味着所有预测都失败了?你能举例说明吗?这种情况在递归函数调用中是否相同?
hardware - 不同的分支预测结果在不同的处理器中
我想问一些关于分支预测的事情。我完全知道它是什么以及它们如何工作或它们的不同类型。我的问题是:我将如何使用每个预测器的性能的处理器?我的意思是,如果我使用相同的基准、相同的预测器但不同的处理器,我会期望相同的命中率吗?我认为是的,因为它只是一个模型,不受处理器类型的影响,但我想确定这一点。
performance - 为什么条件移动不易受到分支预测失败的影响?
在阅读了这篇文章(在 StackOverflow 上的答案)(在优化部分)之后,我想知道为什么条件移动不容易受到分支预测失败的影响。我在这里找到了一篇关于 cond move 的文章(AMD 提供的 PDF)。同样在那里,他们声称 cond 的性能优势。移动。但这是为什么呢?我没看到。在评估该 ASM 指令时,尚不知道前面的 CMP 指令的结果。
c++ - 分支预测:编写代码来理解它;得到奇怪的结果
我试图通过测量运行带有可预测分支的循环与带有随机分支的循环的时间来很好地理解分支预测。
所以我写了一个程序,它采用以不同顺序排列的 0 和 1 的大数组(即全 0,重复 0-1,全 rand),并根据当前索引是 0 还是 1 迭代数组分支,做时间- 浪费工作。
我预计难以猜测的数组会花费更长的时间来运行,因为分支预测器会更频繁地猜测错误,并且无论时间长短,两组数组上运行之间的时间增量都将保持不变 -浪费工作。
然而,随着浪费时间的工作量增加,阵列之间的运行时间差异增加了很多。
(X 轴是浪费时间的工作量,Y 轴是运行时间)
有人理解这种行为吗?您可以在以下代码中看到我正在运行的代码:
Pastebin 链接:http://pastebin.com/F0JAu3uw