问题标签 [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++ - 分支的缓存未命中惩罚
我想知道用 2 次乘法替换分支是否更快(由于缓存未命中惩罚)?
这是我的情况:
我正在尝试将其替换为:
performance - 什么是更好的分支预测器?双峰还是Gshare?
仅以我个人的知识...
Bimodal 或 Gshare 这两者中的哪一个提供了比另一个更正确的预测?为什么?
x86-64 - Intel X86-64 函数内部分支预测的分支历史
是跨函数调用保留分支历史记录,还是在每次输入函数时重新初始化。
c++ - 如何使每帧分支优化友好?
假设我有一个主循环,每帧更新不同的东西:
我可以让它对分支预测器更友好吗?分支预测器能否确定每个块将每n
帧执行一次?是否有一个忽略分支的替代方案(怀疑,假设这些块中有足够不同的逻辑)?
请注意,将完全优化 aswitch
并没有太大区别(如果有的话)。
branch-prediction - 分支预测器推测性地执行什么样的指令?
我正在阅读有关分支预测的内容,我想知道分支预测器是否会“推测性地”执行任何类型的指令。特别是,我想知道它是否会与硬件通信。
假设你有这样的东西:
(在汇编级别, if 之后的第一条指令引发中断,或与硬件通信)。如果分支预测器碰巧“猜错了”,在这种情况下会发生什么?如果这不能发生,为什么?分支预测器将执行什么样的指令?我误解了分支预测器的作用吗?
c++ - 断言中的分支预测提示
我有一个ASSERT(...)
在 C++ 应用程序中使用的自定义宏。
最近在看一些Linux内核模块代码,偶然发现了宏的likely(...)
存在unlikely(...)
。这些向 CPU 提供了一个提示,即给定分支更有可能,并且管道应该针对该路径进行优化。
根据定义,断言的计算结果为真(即likely
)。
我可以在我的ASSERT
宏中提供类似的提示吗?这里的底层机制是什么?
显然我会测量性能上的任何差异,但理论上它应该有什么不同吗?
我只在 Linux 上运行我的代码,但很想知道是否也有跨平台的方式来执行此操作。我也在使用 gcc,但也想支持 clang。
php - 分支预测是 PHP 中的一个大问题吗?
分支预测在 PHP 中也是一个大问题吗?
我指的是这个答案:为什么处理排序数组比处理未排序数组更快?
因此,在 C++ 和 Java 中,排序数组的计算速度比未排序数组快,因为处理器可以正确预测接下来的步骤。
这会以同样的方式指代 PHP 程序吗?
c++ - 奇怪的无限循环(gcc 4.7.3,编译器错误?)
我有以下代码:
我愚蠢地迭代一个容器(自写)。如果我用它编译这个函数cout
并且程序在迭代后正确终止!注意:cout不干扰自制容器!
如果我随后将其注释掉,则测试将开始无限长并且不会终止!我的眼球几乎掉进了我的脑袋里!这里发生了什么黑客攻击???我的第一个猜测是,编译器做错了什么?(但为什么?)或者分支预测让我错了,并且以某种方式将迭代器增加了两次?(这将导致没有 end() 迭代器)。
我真的无法解释这是怎么回事?
实际上 RangeType Container 看起来像这样,并且非常简单,它需要一个范围,并且从头到尾迭代!
这是 MWE:编译示例
谢谢你的帮助!!
f# - F# 编译器可以使用柯里化来根据类型分隔代码路径吗?
F#编译器可以通过currying一个函数来分离代码路径,其中不同类型意味着通过后续调用的函数的不同路径?
考虑以下有区别的联合。有两种可能性,理论上是不同的类型:
假设我们对其中一些情况有一些特定的功能:
以及 2 个函数,它们根据某些类型提供 2 个单独的代码路径param
(完成 fs 文件的其余部分):
因此,Half 和 Double 是独立的代码路径,我们可以将它们编写为两个独立的函数。
从理论上讲,柯里化会说有两种不同的功能;如果您将第一个参数 curry 为 Choice.Halve 或 Choice.Double 类型(如 in doubler
),那么您拥有特定于该类型的函数,编译器应该能够优化以后的分支。
是这样吗?
如果我查看 IL,我看不到这样的优化,但我想这可能是 JITted。一位同事建议分支预测使这种优化变得不必要。
是避免不必要的分支反转结构并传递divide
/halve
函数的唯一方法吗?
- 编辑 -
John Palmer 建议添加inline
,所以我尝试了一下,得到了以下优化的 IL outer
:
然而,curried 函数并没有明显的优化- 所以 uncurrieddoubler
函数main
正在被优化,而不是 curried 函数。
intel - 复杂代码和分支预测器
分支预测器逻辑有多“粘”?如果代码正在从指令缓存中删除,统计信息会保留吗?
换句话说,如果代码很复杂或者不能批量处理,分支预测还有帮助吗?
让我们假设比 2011 年更新的商用英特尔服务器硬件。