问题标签 [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.

0 投票
0 回答
206 浏览

c# - 排序/未排序不同大小数组的分支预测

我很久以前偶然发现了这个问题

为什么处理排序数组比处理未排序数组更快?

并想自己尝试一下。在尝试不同的数组大小时,我得到了一些令人惊讶的结果。

这是测试代码。(C#用微软编译器,其他语言我没测试过)

这是输出。

在发布与调试模式下,相对结果时间通常是相同的(调试大约慢两倍)。

对我来说,最后两个结果是有道理的。它遵循我上面链接的问题的逻辑,并且由于我假设是分支预测,排序后的运行速度更快。然而,前两个结果让我感到困惑。为什么它们几乎同时出现?另外,为什么它们没有比最后两个快得多?我认为较小的数组会导致它位于更近的缓存中,因此整个事情运行得更快。(循环大小 * 数组大小 = 前两个和后两个之间的常数,因此内部迭代次数相同)

0 投票
1 回答
828 浏览

assembly - 分支预测会使我的程序崩溃吗?

通过这本书的第 3 章,称为计算机系统架构:程序员的观点,据说这样的实现

是无效的,因为如果预测失败,那么我们将取消引用 NULL。还指出我们应该使用分支代码。

不过,使用条件跳转不会导致相同的结果吗?例如:

是否可以欺骗 gcc 为 x86-32 输出类似的东西?假设我有一个指向函数的指针数组,其中一些是有效的,一些是无效的,并且我调用每个不是 NULL 的函数。

0 投票
1 回答
1679 浏览

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

这是我第二次问这个问题;第一次有人回复但我花了太长时间回复他们,因此没有得到充分的理解。

我想做的是更多地了解现代架构的指令获取部分;我假设所有指令都由指令提取单元的分支预测器预测,以根据预测进行提取。

另一位试图帮助提及“分支指令”的绅士也与预测的指令一起发送。这个“分支指令”测试分支预测器的预测条件是否正确。我还假设这些分支指令进入分支执行单元,并且不需要从内存中加载任何内容。

我不明白的是:

  • 分支执行单元如何知道这条指令的猜测是否正确?
  • 一旦它知道它是正确的会发生什么?
  • 是否每次预测都会发出分支指令(基本上意味着......每次做出任何预测?)
  • 分支预测必须在预测指令之前还是之后?
  • 分支指令是否需要从内存中加载任何数据?如果是这样,它是什么?

谢谢!

0 投票
1 回答
180 浏览

optimization - Fortran 是否优化了无法访问的分支?

我在 Fortran 和 C 中进行了一些编程,并且我认为 C 预处理器可以非常灵活地添加或隐藏带有预处理常量的代码。我不知道用 Fortran 有什么方法可以做到这一点,但我很好奇:Fortran 编译器是否检测到可以在编译时删除的代码?

以此为例:

echo 的值永远不会改变,但如果编译器没有意识到这一点,它仍然会每次检查分支,以及在可执行文件中包含死的、无法访问的代码。显然这不是一个很大的区别,特别是对于分支预测,但我想知道是否可以添加这样的表达式并且实际上不需要任何成本。是否有优化设置可以做到这一点,或者默认情况下可以做到这一点?

0 投票
3 回答
452 浏览

c++ - 将一个整数的位 X 设置为另一个整数的位 Y 而不分支?

下面的copy_bit功能可以简化为类似的东西out[out_bit] = in[in_bit]吗?(即不使用if语句)

更新:为了清楚起见,这不是家庭作业或建议std::bitset回答问题的 XY 问题。

0 投票
3 回答
756 浏览

cuda - gpgpu:为什么我们在细粒度多线程中不需要分支预测?

当波前执行时,它提供细粒度的多线程。这样做的后果之一是没有分支预测要求,如下图所示:

在此处输入图像描述

但我无法理解这一点。有人可以用简单的方式解释一下吗?

0 投票
1 回答
336 浏览

cuda - 光线追踪算法中的分支预测函数

有没有人在任何光线追踪碰撞测试内核(Cuda、Opencl)中尝试过用于 GPU 计算的自定义分支预测算法?

我是否应该担心低深度(2-5)的性能?

例子:

这可以击败硬件级别的预测吗?这甚至可以使总跟踪时间更好吗?

此伪代码中的 "if" 语句不应包含任何 "if" 。所以它只是根据预测值计算零值或实际值。

谢谢。

0 投票
2 回答
705 浏览

branch-prediction - 分支预测数据存储在哪里/如何存储?

我一直想知道预测数据存储在哪里/如何存储?有限制吗?它只是最近的分支吗?我最关心的是英特尔架构,但我能从任何架构中学到的任何东西都会受到赞赏。

0 投票
1 回答
1120 浏览

java - Code optimization to avoid branching

I just came across this article: Compute the minimum or maximum of two integers without branching

It starts with "[o]n some rare machines where branching is expensive...".

I used to think that branching is always expensive as it often forces the processor to clear and restart its execution pipeline (e.g. see Why is it faster to process a sorted array than an unsorted array?).

This leaves me with a couple of questions:

  • Did the writer of the article get that part wrong? Or was this article maybe written in a time before branching was an issue (I can't find a date on it).
  • Do modern processors have a way to complete minimal branches like the one in (x < y) ? x : y without performance degradation?
  • Or do all modern compilers simply implement this hack automatically? Specifically, what does Java do? Especially since its Math.min(...) function is just that ternary statement...
0 投票
3 回答
1836 浏览

c++ - 函数指针上的分支预测

我有一个反复运行的循环。该循环内的逻辑取决于程序所处的模式。为了提高性能,我认为可以初始化一个函数指针数组functionPtr [],这样就可以调用运行正确逻辑的functionPtrmode。循环将在许多周期内保持相同的模式(这个数字是未知的,但有数千个)。该程序仅在 intel x64 机器上运行,不需要可移植性。

我希望 CPU 会利用分支预测,但由于我的分支不是有条件的(在程序集级别上),但分支的位置确实取决于变量(functionPtr+mode)。CPU 是否会尝试计算 functionPtr+mode 并在流水线中开始拉入这些指令?