23得票2回答
分支目标缓冲区检测到哪些分支预测错误?

我目前正在研究CPU流水线中可以检测分支预测错误的各个部分。我发现这些部分包括: 分支目标缓冲器(BPU CLEAR) 分支地址计算器(BA CLEAR) 跳转执行单元(不确定信号名称是什么??) 我知道2和3检测什么,但我不明白BTB内检测到了什么误判。BAC检测到了BTB错误地为非...

23得票4回答
在CPU仿真中使用switch case时如何处理分支预测

我最近阅读了这里的问题为什么处理有序数组比无序数组快?,发现答案非常有趣,并且完全改变了我在处理基于数据的分支时编程的观点。 我目前有一个相当基本但完全可用的解释器,使用C语言编写,模拟Intel 8080处理器。其核心是一个256行的switch-case表,用于处理每个操作码。我的最初想...

20得票1回答
我能否在现代英特尔Core CPU上测量分支预测失败?

这个问题和它的答案最近被标记为史诗回答,这促使我想知道:在Windows中,我能否以CPU分支预测失败的性能来衡量正在运行的应用程序?我知道有一些静态分析工具存在,可以帮助优化代码以获得良好的分支预测性能,并且手动技术可以通过简单更改和重新测试来帮助,但我正在寻找一些自动机制,可以报告一段时间...

18得票1回答
整数的无分支条件语句——快速,但能否更快?

我一直在尝试以下内容,并注意到这里定义的无分支“if”(现在用&-!!替换了*!!)可以在使用clang的64位Intel目标代码中将某些瓶颈代码的速度提高近2倍: // Produces x if f is true, else 0 if f is false. #define ...

17得票2回答
分支预测:编写代码理解它;获得奇怪的结果

我正在尝试通过测量具有可预测分支和随机分支的循环运行时间来深入了解分支预测。因此,我编写了一个程序,它使用以不同顺序排列的0和1的大型数组(即所有0、重复0-1、所有随机),并根据当前索引是否为0或1进行迭代分支,执行浪费时间的工作。 我原以为更难猜测的数组需要更长时间来运行,因为分支预测器...

15得票3回答
断言中的分支预测提示

我在C++应用程序中使用一个自定义的ASSERT(...)宏。#include <stdlib.h> #include <iostream> /// ASSERT(expr) checks if expr is true. If not, error details...

15得票2回答
英特尔CPU指令队列提供静态分支预测?

在Intel手册的第3卷中,它包含了一个硬件事件计数器的描述: BACLEAR_FORCE_IQ 计算指令队列强制执行BACLEAR的次数。 IQ还负责根据静态方案和L2分支预测单元提供的动态数据提供条件分支预测方向。 如果在目标数组中没有找到条件分支目标并且IQ预测分支已经...

14得票4回答
分支预测失误是否会使整个流水线清空,即使是非常短的if语句体?

我所阅读的所有内容都表明,分支预测错误总是导致整个流水线被清空,这意味着大量的浪费周期。我从未听说过任何关于短if条件的例外。 这在某些情况下似乎非常浪费。例如,假设你有一个单独的if语句,其非常简单的主体被编译成1个CPU指令。if子句会被编译为向前条件跳转一个指令。如果CPU预测分支不被...

14得票1回答
分支预测会导致程序崩溃吗?

在阅读名为计算机系统结构:程序员的视角的书籍第三章时,提到了这样一种实现: testl %eax, %eax cmovne (%eax), %edx 如果预测失败,那么“is invalid”就是无效的,因为我们将会遇到NULL引用错误。文中也指出我们应该使用分支代码。 不过,使用条件...

13得票3回答
避免管道停滞,通过计算条件提前执行。

谈到ifs的性能时,通常会讨论误预测如何会使流水线停滞。我看到的推荐解决方案有: 对于通常只有一个结果的条件,信任分支预测器;或者 尽可能使用一些位运算技巧来避免分支; 或者 尽可能使用条件移动。 我找不到的是我们是否可以提前计算条件以在可能的情况下帮助。所以,与其:... work ...