在处理用于执行指令的流水线架构时,避免危险的方法之一是使用延迟槽,或阻止某些指令访问在它们上面的行中计算的值的规则。我的理解是,汇编程序会尝试在您的指令之间移动不相互依赖的指令,以便在依赖指令等待时可以执行非依赖指令。这个特性是可能的,还是在没有真正编译时间的解释语言的情况下会发生这种情况?
(请注意,如果我上面所说的任何内容反映了我的理解上的差距,请更正它,因为这些概念对我来说是新的)。
在处理用于执行指令的流水线架构时,避免危险的方法之一是使用延迟槽,或阻止某些指令访问在它们上面的行中计算的值的规则。我的理解是,汇编程序会尝试在您的指令之间移动不相互依赖的指令,以便在依赖指令等待时可以执行非依赖指令。这个特性是可能的,还是在没有真正编译时间的解释语言的情况下会发生这种情况?
(请注意,如果我上面所说的任何内容反映了我的理解上的差距,请更正它,因为这些概念对我来说是新的)。
汇编器不移动任何东西,这是编译器优化的领域(在编译时),或者运行时的 Jitters(如果存在)(在处理 java 或其他 jitted 语言时)。
解释器通常是一个简单得多的结构,它负责一次接收一条指令并在某个主机系统上执行它(沿着从一种架构到另一种架构的翻译,或从字节码到机器码的翻译)。理论上可以构建一个可以混洗代码的解释器,但这有点多余,因为 jitted 语言可以重新编译整个代码并将此重新排序作为其中的一部分。它也不是很有用,因为由于开销,基线解释运行模式在主机 CPU 上已经非常慢,简单的代码 shuffle 技巧几乎不会影响性能。
另请注意,在现代硬件上,大多数简单的重新排序都是毫无意义的——乱序执行引擎无论如何都会在内部重新排列代码,以便在解决其数据依赖性后每条指令都可以执行。对于控制依赖,市场上确实有很好的分支预测器,所以你几乎不会停滞不前 - 你只是推测并刷新以防你错了(这是值得的,因为在大多数情况下预测准确度可以达到约 95%)。
重新排序仍然有重要的好处,但不是为了消除气泡,主要是为了负载提升、循环不变的代码运动和消除硬件无法自行重新排序的内存错误依赖。但是,这不是您可以在解释时进行的简单重新排序,您需要为此进行实际编译或抖动。
想想我的世界电脑。实际上,它是一个解释器:一个程序读取指令并选择哪些内部函数/例程实时执行其输入指令,而不是通过编译。
解释器本身——在这种情况下是我的世界程序——可能能够利用 CPU 级别的调整,但应用程序——红石计算机——不能。
红石计算机面临的一个问题是它的级别非常低,解释器为实现计算机提供的结构很少。因此,整个事情都是非常受数据驱动的,CPU 预读和优化的机会很小。
级别越高 - 因此,您为解释器编码的结构越复杂,它的程序就越能从 CPU 调整中受益。
但是不,纯粹的解释语言不能。