【问题标题】:Can interpreted languages use delay slots?解释语言可以使用延迟槽吗?
【发布时间】:2013-12-28 22:15:57
【问题描述】:

在处理用于执行指令的流水线体系结构时,避免危险的方法之一是使用延迟槽,或防止某些指令访问在它们上面的行中计算的值的规则。我的理解是,汇编程序会尝试在您的指令之间移动不相互依赖的指令,以便在依赖指令等待时可以执行非依赖指令。这个特性是可能的,还是在没有真正编译时间的解释语言的情况下发生?

(请注意,如果我上面所说的任何内容反映了我的理解上的差距,请更正,因为这些概念对我来说是新概念)。

【问题讨论】:

  • 大多数现代 CPU 依赖于自动指令重新排序,并且无论如何都不会向程序公开诸如“延迟槽”之类的功能。

标签: computer-architecture delayed-execution interpreted-language


【解决方案1】:

想想minecraft computer。实际上,它是一个解释器:一个程序读取指令并选择哪些内部函数/例程实时执行其输入指令,而不是通过编译。

解释器本身 - 在这种情况下是 minecraft 程序 - 可能能够利用 cpu 级别的调整,但应用程序 - 红石计算机 - 不能。

红石计算机遇到的一个问题是它的级别非常低,解释器提供的实现计算机的结构很少。因此,整个过程非常受数据驱动,CPU 进行预读和优化的机会很少。

更高级别 - 因此,您为解释器编码的结构越复杂,它的程序就越能从 CPU 调整中受益。

但是不,纯解释型语言不能。

【讨论】:

    【解决方案2】:

    汇编器不会移动任何东西,这是编译器优化的领域(在编译时),或者运行时的 Jitters(如果存在)(在处理 java 或其他 jitted 语言时)。
    解释器通常是一个简单得多的结构,它负责一次接收一条指令并在某个主机系统上执行它(沿着从一种架构到另一种架构的翻译,或从字节码到机器码的翻译)。理论上可以构建一个可以混洗代码的解释器,但这有点多余,因为 jitted 语言可以重新编译整个代码并将此重新排序作为其中的一部分。它也不是很有用,因为由于开销,基线解释运行模式在主机 CPU 上已经非常慢,简单的代码 shuffle 技巧几乎不会影响性能。

    还要注意,在现代硬件上,大多数简单的重新排序都是没有意义的——乱序执行引擎无论如何都会在内部重新排列代码,以便在解决其数据依赖性后每条指令都可以执行。对于控制依赖,市场上确实有很好的分支预测器,所以你几乎不会停滞不前——你只是推测并刷新以防你错了(这是值得的,因为在大多数情况下预测准确度可以达到约 95%)。

    重新排序仍然有重要的好处,但不是为了消除气泡,主要是为了负载提升、循环不变的代码运动和消除硬件无法自行重新排序的内存错误依赖项。但是,这不是您可以在解释时执行的简单重新排序,您需要为此进行实际编译或 jitting。

    【讨论】:

    • Niggle:斯坦福 MIPS 使用汇编程序来进行有限的指令重排序(和打包)。 “汇编语言指令集,定义解包的指令,没有流水线依赖或分支延迟。” (“高性能 VLSI 处理器的设计”,Hennessy 等人,1983,TR#236)。其目的是允许汇编级别的兼容性和特定于实现的机器代码,同时允许在实现中进行更改。 (这主要只是一个历史脚注。)
    • @PaulA.Clayton,有许多数据流和 VLIW 架构允许您使用预先确定的依赖关系执行代码,因此您可以根据需要重新排序代码。我认为他们中的大多数都使用专门的编译器来为您完成大部分工作。
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2021-10-15
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多