2019.11.27

前言:之所以想看这篇文章是因为上一周看的An Overview of Virtual Machine Architectures里提到了一类设计专门用于运行虚拟机的硬件,Transmeta Crusoe是其中的一个i例子,正好斯坦福的阅读清单中有一片关于Transmeta Crusoe的文章,所以觉得这次就看这篇文章了。

难易程度:3/10

推荐:7/10

关键词:硬件支持动态翻译,Transmeta Crusoe

特点:毕竟是商业芯片,大多是描述性的文字。

(F) A. Klaiber. The Technology Behind Crusoe Processors. Transmeta Technical Brief, 2000

毕竟是商业产品,基本是描述性的文字,很难对crusoe的结构和性能有深入的了解。

简单的说Crusoe和X86体系结构的区别在于:

  • 硬件(crusoe的ISA)和操作系统之间添加中间层用来虚拟x86的ISA,这个中间层叫做Code Morphing;
  • 硬件上没有乱序执行,取而代之的是中间层(Code Morphing)来发掘程序的并行性,生成超长指令(超长指令是并行执行的,等价于多发射,在这篇论文里一个超长指令字包含4个实际的指令,所以等价于4发射);:看到这里突然想去了解了解VLIW的现状了,感觉VLIW会使得体系结构非常简单,且一定程度上能够有乱序多发射的效果。找一篇最近VLIW测评的文章看看吧。斯坦福阅读清单里有一篇2002年的VLIW的文章Vector Vs Superscalar and VLIW Architectures for Embedded Multimedia Benchmarks
  • 中间层(Code Morphing)本质上是一个动态翻译器,因此众多动态翻译的优化技术可以运用:
    • 缓存优化过的代码,
    • 收集运行信息用于指导优化,
      • 发现频繁执行的代码块,下工夫优化这些代码,
      • 发现分支跳转倾向,进行预测,

硬件对动态翻译的支持:

  • 精确异常/中断:每执行一段时间会commit一次(寄存器操作和访存操作生效),若在超长指令里遇到了异常/中断,则回到上一个commit的状态(寄存器和内存的状态都要恢复),重新保守地执行代码,然后处理精确异常/中断。

    所需的硬件支持就很简单,两套寄存器堆(working, shadow),内存用gated store buffer。

  • 访存的别名:

    ld %r30, [%x] # first load from location x
    ...
    st %data, [%y] # might overwrite location x
    ld %r31, [%x] # this accesses location x again
    use %r31
    

    即load指令只能否超前store指令的问题,因为访存存在别名,所以超前可能会出现错误(但是别名是小概率时间,所以出错是小概率事件)。

    为此Crusoe新增load-and-protect指令(load且记录load的地址和数据大小)和store-under-alias-mask指令(检查是否是保护的地址范围,是则会发生异常)。有了这俩指令,上面的例子可以优化为,

    ldp %r30, [%x] # load from x and protect it
    ...
    stam %data,[%y] # this store traps if it writes x
    use %r31
    

    硬件应该也可以完成这个工作吧,虽然当时还没有,现在的乱序模型的CPU是不是也还是没有实现这个?

  • 自修改代码:代码修改了内存里的代码,需要确保翻译好的代码会被无效掉。所以内存页的表项里添加了translated的比特,表示是否被翻译,当被翻译的页被修改时,就简单的方法是丢弃掉翻译好的代码。

可以直接用Crusoe的ISA变成,比如电源管理。(文章提到了当时Intel还不知动态调整CPU频率,Crusoe可以。现在Intel也可以了。)

总结:Cursoe的目标市场是追求低功耗的移动平台。