打印

ARM指令流水线关键技术分析与代码优化(ARM9)

[复制链接]
5209|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Fe_ARM|  楼主 | 2010-8-30 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Fe_ARM 于 2010-8-30 20:31 编辑

3 五级流水线技术
   
五级流水线技术在多种RISC处理器中被广泛使用,被认为是经典的处理器设计方式。五级流水线中的存储器访问部件(访存)和寄存器回写部件,解决了三级流水线中存储器访问指令在指令执行阶段的延迟问题。图5为五级流水线的运行情况(五级流水线也存在阻断)。
3.1 五级流水线互锁分析
    五级流水线只存在一种互锁,即寄存器冲突。读寄存器是在译码阶段,写寄存器是在回写阶段。如果当前指令(A)的目的操作数寄存器和下一条指令(B)的源操作数寄存器一致,B指令就需要等A回写之后才能译码。这就是五级流水线中的寄存器冲突。如图6所示,LDR指令写R9是在回写阶段,而MOV中需要用到的R9正是LDR在回写阶段将会重新写入的寄存器值,MOV译码需要等待,直到LDR指令的寄存器回写操作完成。(注:现在处理器设计中,可以通过寄存器旁路技术对流水线进行优化,解决流水线的寄存器冲突问题。)
    虽然流水线互锁会增加代码执行时间,但是为初期的设计者提供了巨大的方便,可以不必考虑使用的寄存器会不会造成冲突;而且编译器以及汇编程序员可以通过重新设计代码的顺序或者其他方法来减少互锁的数量。另外分支指令和中断的发生仍然会阻断五级流水线。
3.2 五级流水线优化
   
采用重新设计代码顺序在很多情况下可以很好地减少流水线的阻塞,使流水线的运行流畅。下面详细分析代码优化对流水线的优化和效率的提高。
    要实现把内存地址0x1000和Ox2000处的数据分别拷贝到0x8000和0x9000处。
    Oxl000处的内容:1,2,3,4,5,6,7,8,9,10
    Ox2000处的内容:H,e,l,l,o,W,o,r,l,d
    实现第一个拷贝过程的程序代码及指令的执行时空图如图7所示。
    全部拷贝过程由两个结构相同的循环各自独立完成,分别实现两块数据的拷贝,并且两个拷贝过程极为类似,分析其中一个即可。
    T1~T3是3个单独的时钟周期;T4~T11是一个循环,在时空图中描述了第一次循环的执行情况。在T12的时候写LR的同时,开始对循环的第一条语句进行取指,所以总的流水线周期数为3+10×10+2×9=121。整个拷贝过程需要121×2+2=244个时钟周期完成。
    考虑到通过减少流水线的冲突可以提高流水线的执行效率,而流水线的冲突主要来自寄存器冲突和分支指令,因此对代码作如下两方面调整:
    ①将两个循环合并成一个循环能够充分减少循环跳转的次数,减少跳转带来的流水线停滞;
    ②调整代码的顺序,将带有与临近指令不相关的寄存器插到带有相关寄存器的指令之间,能够充分地避免寄存器冲突导致的流水线阻塞。
    对代码调整和流水线的时空图如图8所示。
    调整之后,T1~T5是5个单独的时钟周期,T6~T13是一个循环,同样在T14的时候BNE指令在写LR的同时,循环的第一条指令开始取指,所以总的指令周期数为5+10×10+2×9+2=125。
    通过两段代码的比较可看出:调整之前整个拷贝过程总共使用了244个时钟周期,调整了循环内指令的顺序后,总共使用了125个时钟周期就完成了同样的工作,时钟周期减少了119个,缩短了119/244=48.8%,效率提升十分明显。
    代码优化前后执行周期数对比的情况如表1所列。
本文出自:
[1]邱铁 编著.ARM嵌入式系统结构与编程. 清华大学出版社. 2009.3

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:ARM+linux

11

主题

124

帖子

0

粉丝