问题标签 [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++ - 如何演示指令缓存限制的影响
我最初的想法是给出一个优雅的代码示例,以展示指令缓存限制的影响。我使用模板元编程编写了以下代码,它创建了大量相同的函数。
外部循环使用跳转表来改变要调用的不同函数的数量。WORKLOAD
对于每个循环通过,然后测量调用函数所花费的时间。现在结果如何?下图显示了与使用范围相关的每个函数调用的平均运行时间。蓝线显示在 Core i7 机器上测量的数据。红线所示的比较测量是在 Pentium 4 机器上进行的。然而,当谈到解释这些台词时,我似乎有点挣扎......
分段常数红色曲线的唯一跳跃恰好发生在范围内所有函数的总内存消耗超过测试机器上一个缓存级别的容量的地方,该机器没有专用的指令缓存。然而,对于非常小的范围(在这种情况下低于 4),运行时间仍然会随着函数的数量而增加。这可能与分支预测效率有关,但由于在这种情况下每个函数调用都会减少为无条件跳转,所以我不确定是否应该有任何分支惩罚。
蓝色曲线的行为完全不同。运行时间对于小范围是恒定的,然后以对数方式增加。然而,对于更大的范围,曲线似乎再次接近恒定的渐近线。如何准确地解释两条曲线的质量差异?
我目前正在使用 GCC MinGW Win32 x86 v.4.8.1g++ -std=c++11 -ftemplate-depth=65536
没有编译器优化。
任何帮助,将不胜感激。我也对如何改进实验本身的任何想法感兴趣。提前致谢!
branch-prediction - 分支错误预测
这个问题可能很傻,但我还是会问。我从这个Mysticial 的回答
中听说了分支预测
,我想知道是否有可能发生以下情况
假设我有这段 C++ 代码
因此,如果分支预测器在某些情况下错误地预测 if 语句为真,然后程序更改 *memoryAddress 的值,那么可能会发生不好的情况吗?会发生分段错误之类的事情吗?
computer-architecture - 了解停顿和分支延迟槽
我正在学习计算机体系结构课程。我从另一所大学找到了这个网站,该网站有迄今为止对我有帮助的笔记和视频:CS6810,犹他大学。我正在处理该网站上发布的一些旧家庭作业,尤其是这个。我正在尝试理解流水线和相关概念,特别是停顿和分支延迟槽。
我现在正在查看那个旧家庭作业中的第一个问题,并且不确定如何解决这些问题。
问题如下:
考虑以下代码段,其中 30% 的时间使用分支,而 70% 的时间未使用分支。
R1 = R2 + R3
R4 = R5 + R6
R7 = R8 + R9
如果 R10 = 0,则分支到 linex
R11 = R12 + R13
R14 = R11 + R15
R16 = R14 + R17
...
线:R18 = R19 + R20
R21 = R18 + R22
R23 = R18 + R21
...
考虑一个 10 阶段的有序处理器,其中指令在第一阶段被提取,并且分支结果在三个阶段之后是已知的。在以下场景下估计处理器的 CPI(假设处理器中的所有停顿都与分支相关,并且分支占所有执行指令的 15%):
在每个分支上,提取都会停止,直到知道分支结果为止。
每个分支都被预测为不被采用,如果分支被采用,错误获取的指令将被压缩。
处理器有两个延迟槽,分支后面的两条指令总是被取出并执行,并且
3.1。您找不到任何说明来填补延迟槽。
3.2. 您可以在分支到延迟槽之前移动两条指令。
3.3. 您可以将标签“linex”之后的两条指令移动到延迟槽中。
3.4. 您可以在分支(在原始代码中)之后立即将一条(注意:一条,而不是两条!)指令移动到延迟槽中。
我什至不确定如何开始看待这个问题。我已经阅读了该网站上的所有笔记并观看了视频,并阅读了 H&P 书中的部分内容,但仍然对这个问题感到困惑。如果有人有时间,我会很感激有人帮助我解决这个问题。我只需要知道如何开始概念化答案。
c - 感知器分支预测器在 C 中的实现
我正在阅读有关使用感知器进行动态分支预测的论文http://www.cs.utexas.edu/~lin/papers/hpca01.pdf 。我想知道如何在 C 中实现感知器分支预测器,如果给定 1000 个 PC 地址(字地址)和 1000 个记录在跟踪行中的分支实际结果的列表。本质上,我想使用这些跟踪来衡量各种预测变量的准确性。跟踪文件中的分支结果应用于训练您的预测器。有什么建议么?
testing - 分析具有一定管道深度的分支预测精度
目前我正在研究分支预测精度以及与管道深度的关系和/或使用并行获取(超标量处理器中的 fe)。是否可以通过软件的使用来分析这种关系?我正在考虑使用 zesto ( http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=4919638&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D4919638 ) 和 sim-bpred 模拟器 ( http://www.ece.uah.edu/~lacasa/tutorials/ss/ss.htm#sim-bpred )。并使用 IPC(每个周期的#instructions)等指标。使用这些有什么(缺点)优点?或者还有其他(好的)方法可以对这个主题进行分析吗?
computer-science - 管道分支预测性能示例
我正在研究管道危害的示例,并正在查看以下文档中的问题 2
我发现这有所帮助。
据我了解,这些策略的工作方式如下:
- 停止直到一切都知道:将停止直到到达 MEM2 阶段完成。据我了解,这是最简单的策略,所有 => 5、5、5 的停顿周期都是相同的。
- 假设未采用:将仅假设分支未采用。在这种情况下,当采用分支时,您将不得不停止 IF1 阶段之后的所有内容 => 7,0,7
- 假设:大致是#2的倒数;当不采用分支时,您将不得不停止 IF1 阶段 => 0,7,0
我不确定我的理解是否正确。如果有人可以批评我的解决方案并告诉我我的想法是否正确或解释我错在哪里,将不胜感激。
EDIT1:回答问题
1)你希望什么时候知道你是对的(分支决议)?
我相信您会通过 EX 步骤知道分支分辨率。
2) 你希望什么时候知道你想要什么时候选择分支(对还是错)?
我相信您会知道何时要按 AG 步骤进行分支。
3) 你什么时候知道地址?
我相信你会知道 AG 步骤之后的下一个地址。
EDIT2:“等到一切都知道为止。” 我的理解是,无论是否采用分支(有条件或无条件),管道将在 AG 阶段开始停止,并将继续停止直到 EX 阶段完成。含义:在所有情况下都必须停止 4 个周期。
它看起来如下所示:I# = IF#,M# = MEM#,ST = Stall
EDIT3:“假设未采取”。我的理解是,顾名思义,您假设每个分支(有条件的或无条件的)都被采用。这里唯一会发生的停顿是分支被占用的情况。摊位将发生在与之前相同的地方。因此,在这种情况下,在分支(有条件或无条件)发生的情况下,您将获得 4 个停顿,而在没有出现分支的情况下,您将获得 4 个停顿。
它看起来像以下
EDIT4:“假设采取”。这本质上与之前的策略相反。在没有发生分支的情况下会有 4 个停顿,但在发生分支(有条件或无条件)的情况下没有。
它看起来像以下
cpu - 分支预测器和分支目标缓冲区如何共存?
我的问题是它们如何在现代 CPU 架构中共存和协同工作?
assembly - `rep ret` 是什么意思?
我在 Visual Studio 2008 上测试一些代码并注意到security_cookie
. 我可以理解它的重点,但我不明白这个指令的目的是什么。
当然我可以理解评论:)但是这个前缀exaclty在上下文中做了ret
什么,如果ecx
是!= 0会发生什么?显然,当我调试它时,循环计数ecx
被忽略了,这是可以预料的。
我发现它的代码在这里(由编译器注入以确保安全):
assembly - 分支预测会导致非法指令吗?
在以下伪代码中:
假设 CPU 不支持该rdtscp
指令,所以我们回退到 else 语句。
如果 CPU 错误预测了分支,指令流水线是否有可能尝试执行rdtscp
并抛出Illgal Instruction
错误?
c - Linux 内核:可能()与不太可能()
这两种方法似乎在 linux 内核代码中被广泛使用。我知道分支预测的基础,但我想知道这两个函数如何影响 if() 语句的操作。它们是否也在 CPU 指令流水线级别工作?还是在内核代码级别处于更高的抽象级别?
作为 linux 内核的初学者,我会对了解这两种方法的内部工作原理非常感兴趣。谢谢!