Virtual machine 分支预测优化是否可以继承?

Virtual machine 分支预测优化是否可以继承?,virtual-machine,branch-prediction,Virtual Machine,Branch Prediction,在自己的VM解释器中实现自己的分支预测优化有意义吗?或者在已经有分支预测优化支持的硬件上运行VM就足够了?这在有限的意义上是有意义的 例如,在JIT编译器中,在生成程序集时,您可能会根据观察到的分支概率决定布局代码。这只需要一种非常简单的预测器,它知道总体概率,但不需要识别任何模式。如果您确实识别了模式,那么您可以进行更复杂的优化,例如,一个带有嵌入式分支的循环可以将每次迭代交替展开2倍,并且可以为观察到的情况高效地创建主体 对于解释器来说,它似乎没有那么有用,但可以想象一些复杂的设计,将一些相

在自己的VM解释器中实现自己的分支预测优化有意义吗?或者在已经有分支预测优化支持的硬件上运行VM就足够了?

这在有限的意义上是有意义的

例如,在JIT编译器中,在生成程序集时,您可能会根据观察到的分支概率决定布局代码。这只需要一种非常简单的预测器,它知道总体概率,但不需要识别任何模式。如果您确实识别了模式,那么您可以进行更复杂的优化,例如,一个带有嵌入式分支的循环可以将每次迭代交替展开2倍,并且可以为观察到的情况高效地创建主体


对于解释器来说,它似乎没有那么有用,但可以想象一些复杂的设计,将一些相邻的指令融合到一个单一的操作中以提高效率,这可能会受益于分支预测。类似地,解释器可能会从识别循环中受益。

显然,您谈论的是解释字节码的VM,而不是CPU的硬件虚拟化

如何实施?CPU中的分支预测之所以需要,是因为它们是流水线的,并且用于推测性的无序执行

如果解释器软件需要执行更多的工作,那么这些事情对解释器软件来说都没有意义。通过阵列的循环隐藏负载和ALU延迟是值得的,尤其是在旧的顺序CPU上,但这不会增加要运行的指令总数。如果您不确定下一步需要做什么,请将推测留给硬件OoO exec


请注意,对于纯非JIT解释器,来宾代码中的控件依赖项在解释器中成为数据依赖项,而来宾代码中的不同指令序列在解释器中创建控件依赖项(以分派给处理程序函数)。看

您可能需要关心将运行代码的CPU中的分支预测。最近(就像自Haswell以来的Intel一样),使用IT-TAGE预测器,CPU在这方面终于不错了:

您不需要在软件中实现分支预测,但对于较旧的CPU来说,考虑到硬件分支预测,调优解释器是值得的。有一些链接,特别是讨论了对于较旧的CPU(在编写时是当前的)来说,拥有一个“grand central”调度分支(如每个指令处理函数返回的单个
开关)有多糟糕。这意味着哪条指令倾向于遵循哪条其他指令的整个模式必须为该单个分支进行预测。如果没有IT-TAGE之类的工具,单个分支的预测状态非常有限


针对旧CPU的调优可能涉及将分派放在每个处理程序函数末尾的下一条指令,而不是返回到单个分派循环。但是,同样,这不是实现分支预测,而是为它进行调整

您是在谈论一个本身在硬件上运行的仿真器或解释器吗?您的问题对于硬件虚拟化没有意义。(VM出口不是分支预测的,通常CPU直接执行客户机代码)。但是,如果您指的是解释仿真器,如CPython或BOCHS,那么您可能需要关心将运行代码的CPU中的分支预测。最近(就像哈斯韦尔之后的英特尔一样),这一点终于不错了:@PeterCordes我说的是解释器。例如,在EVM(以太坊VM)中实现分支预测有意义吗?