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