gpt4 book ai didi

c - 在 CPU 仿真中使用 switch case 时如何处理分支预测

转载 作者:太空狗 更新时间:2023-10-29 16:30:48 27 4
gpt4 key购买 nike

我最近在这里阅读了这个问题 Why is it faster to process a sorted array than an unsorted array?并找到了绝对令人着迷的答案,它完全改变了我在处理基于数据的分支时对编程的看法。

我目前有一个相当基本但功能齐全的解释型英特尔 8080 仿真器,它是用 C 语言编写的,操作的核心是一个 256 长的 switch-case 表,用于处理每个操作码。我最初的想法是,这显然是最快的工作方法,因为操作码编码在整个 8080 指令集中并不一致,解码会增加很多复杂性、不一致和一次性情况。充满预处理器宏的 switch-case 表非常简洁且易于维护。

不幸的是,在阅读上述帖子后,我突然想到我计算机中的分支预测器绝对无法预测 switch case 的跳跃。因此,每次导航 switch-case 时,管道都必须被完全删除,导致几个周期延迟,否则这个程序应该是一个非常快的程序(我的代码中甚至没有乘法)。

我敢肯定你们中的大多数人都在想“哦,这里的解决方案很简单,转向动态重新编译”。是的,这看起来确实会削减大部分开关盒并显着提高速度。不幸的是,我的主要兴趣是模拟旧的 8 位和 16 位时代的控制台(这里的英特尔 8080 只是一个例子,因为它是我最简单的模拟代码),其中周期和时间保持准确的指令很重要,因为视频和声音必须根据这些确切的时间进行处理。

当处理这种级别的准确性时,性能成为一个问题,即使对于较旧的控制台也是如此(例如,看看 bSnes)。在处理具有长流水线的处理器时,是否有任何追索权或这只是一个事实?

最佳答案

相反,switch语句很有可能被转换为jump tables ,这意味着它们可能会执行一些 if(用于范围检查)和一次跳转。 if 不应导致分支预测出现问题,因为您不太可能有错误的操作码。跳转对流水线不是很友好,不过到头来,整个switch语句,就这么一个..

我认为您无法将较长的操作码 switch 语句转换为任何其他可带来更好性能的形式。当然,前提是您的编译器足够聪明,可以将其转换为跳转表。如果没有,您可以手动执行此操作。

如有疑问,请实现其他方法并衡量绩效。

编辑

首先,请确保您不会混淆 branch predictionbranch target prediction .

分支预测仅适用于分支语句。它决定分支条件是失败还是成功。它们与跳转语句无关。

另一方面,分支目标预测试图猜测跳跃的终点。

因此,您的陈述“分支预测器无法预测跳跃”应该是“分支目标预测器无法预测跳跃”。

在您的特定情况下,我认为您实际上无法避免这种情况。如果你有一个非常小的操作集,也许你可以想出一个涵盖所有操作的公式,就像在逻辑电路中所做的那样。然而,对于与 CPU 一样大的指令集,即使它是 RISC,该计算的成本也远高于单次跳转的代价。

关于c - 在 CPU 仿真中使用 switch case 时如何处理分支预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11668090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com