Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2197873
  • 博文数量: 436
  • 博客积分: 9833
  • 博客等级: 中将
  • 技术积分: 5558
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-29 10:27
文章存档

2013年(47)

2012年(79)

2011年(192)

2010年(118)

分类: IT业界

2013-01-19 17:42:22

Execution Migration in a Heterogeneous-ISA Chip Multiprocessor 读书报告

前面已经读过这篇文章了,我读的是14节,这次是从第5节开始第7节。

5小节主要是从移位进程(Migration Process)来讲的,为了促进一个移位进程的内存映像的转变,我们引进了一个小的程序,叫做堆栈变压器(Stack Transformer)。这个ST有三个主要的工作:1、创建寄存器状态为移位到编码;2、修理所有在栈里的返回地址;3、改变移动变量的值在激活函数到正确的栈偏移。ST必须保证每个基于栈变量的值都在代码所期望的移位的地址里。一些之后的在GCC里的优化通过揭露了新的活缓存器通过调用点。用这样一种方式Live register 不能总是相符于高级别的变量名。此外,转变不能总是应用于一致的体系架构,导致了体系架构状态不能转变在移外期间。这些在移位通过时的不协调不是优化算法所固有的,而是一种假象在优化GCC里的是这些优化与移位相协调。为了解决这个,有两种办法,第一,这种优化可以由RTL来通过3个次,用这种方式优化可以被一直应用在编译过程对于两种结构,被揭露的中间级别的状态能够被分派标签在中间表示期间直到寄存器分配;第二,优化通过可以被修改避免应用优化于调用站点。这个如何做,依赖于优化操作,假如优化移动代码,代码移动通过调用点可以被避免,假如优化是删除指令就要避免删除一个指令揭露了一个新的Live register 在任何的调用站点。两种方法,改变RTL通过3个级别和降低优化障碍在所有的调用点,可能会导致少于理想的性能超过现实的执行。但是为了最小的性能退化我们观察了禁止所有的性能优化,期望性能权衡最小并可以接受,为了这个研究,我们禁止了所有的存在疑问的RTL最优化次数,循环不变量移动式、共子表达式消去、向传播、重装指令安排等等。

Stack Transformer 的工作就是改变特定结构的程序状态从ISA A 和ISA B,以便为了程序执行在ISA B 上将发现所有的在移位后所预设的数据。移位期间多重函数会被立刻打开,在每个函数中局部变量的值可能会在三个地方:a register, a fixed stack slot allocated on function entry, or a register spill location on the stack (either in the owning function’s frame or in the frame of a descendant function).ST必须移动活化变量的值在打开的函数到编码所期待的位置。从一个较高的级别ST执行两个快速通道,由于我们不知道那个变量的值应该被放在被调用保留溢出位置直到发现原函数保留其中一个局部变量在被调用保留寄存器里。第一个通道从表里到表外,第二个通道工作起始于相反方向,从表外结构到表里。

第6小节是关于在移位过程中的二进制转换。二进制转换执行在移位操作,直到达到一个对等点,在这样一个点的栈转变描述在先前的部分转变程序状态为了本地执行。二进制转换用以下的方案经典的即时编译动态翻译:开始于移位指令点,每一个指令被翻译到ISA的移位到核和放在内核缓存直到偶然遇到一个函数调用点或者一个间接跳动指令;接着一个根添加到指令翻译快的尾部;控件然后转移到翻译代码在代码缓存里。假如核最终放弃控制返回到翻译引擎,我们重复以上的步骤从指令的目标地址直到最终到达函数的调用点。

翻译引擎在翻译下一个指令块前,检测假如这个块是可用的在代码缓存区,就会链接之前的指令块的尾部到下一个块的开始用一个直接的指令分支。这个过程被叫做Translation Block(TB),已经被广泛的应用于仿真器和虚拟机里。我们延生这个想法通过允许翻译块从在TB中部的任何指令到任何在其他TB中的指令。这个就允许一个TB被连接到多于一个TB在不同的指令。这个被叫做多重入口多重出口(MEME)翻译块连接。在一个MEME TB中任何指令可以有多个入口点包括那些个检测条件码。为了提升性能,二进制转换执行懒于执行条件码,延迟了一个条件码的执行直到它被检测。每一个指令都会在执行之前检测CC,假如没有执行由于有多个入口点我们也不知道一个CC是否被执行。为了克服这个问题,我们更新一个dirty CC map register 在每一个出口点。这个dirty CC可以被用来检测是否执行了CC。ARM允许指令用程序计数器作为一个普通目的的寄存器。由于性能原因,程序计数器没有更新在执行完一个目标指令块的时候。我们深入的优化这个通过增加一个移位从上次计算的PC而不是移动入口32位的地址。为了可复这个我们维持了一个映像在上次计算PC在每一个TB中的指令。通过更新last-calculated PC 在每一个出口的尾部。指令调度,指令在一个反一块内必须被记录。我们不知道指令调度优化但我们可以填充分支延迟槽。分支延迟槽被填满用一个独立的指令前驱到分支在同一个TB中。

不管高级别的相似性,ARM和MIPS代表有意义的重要性。ARM有许多特点是MIPS 所缺少的:condition codes and an abundance of predicated instructions, load multiple

and store multiple instructions, a program counter that is accessible as a general-purpose register, and finally PC-relative load instructions to access data embedded in the text section. MIPS 有两倍多的整形寄存器可利用被程序员和允许16位的即时约束相对于8位的在ARM。每一个ISA有一个不同的应用二进制接口。寄存器分配从ARM到MIPS:ARM对于程序员来说有可视一般目的的16寄存器,而MIPS有31。因此,16的可以容易的映射到31寄存器,反过来就不行了,因此我们频繁的映射MIPS 寄存器ARM。一个寄存器指向一个内存中的内容块。另外我们保留了3个作为缓存寄存器作为快速进入。

    第7节是实验研究法,来测试移位和编译的运行时间性能影响对于移位操作。用SPEC 2000 整形基准写入C语言。通过这个我们排出了GCC标准检查程序,因为它用不标准的堆栈C库函数来动态的分配内存在栈里而不是在堆上,在这个时期我们的移位技术还不能支持变量大小的栈表。ST是用C++写的,设计作为一个证明内容,还存在许多发展空间在性能优化方面。这篇论文可以被看做是保守估计的潜在性能优化。

阅读(757) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~