近年来,高性能多处理器的设计在体系结构中开始占据越来越重要的位置。多处理器结构的出现,降低了对于指令级并行的要求,取而代之的是对于线程级并行的研究1]。对于特定应用来说,异构结构是更好的选择。异构结构处理器有着不同的结构和处理能力,可以根据应用程序本身的特点,将其不同部分分配在不同的处理器上执行,以提高执行的效率,加快执行的速度。
本文所要讨论的就是一种异构多核结构的设计及其实现。本文以Motion-JPEG的视频解码程序作为应用,设计了一个拥有3个处理器的异构多核结构。该结构是在Tensilica的XTSC[2]平台下实现的,并且移植使用了轻量级操作系统内核—Mutek[3]。在下面的章节里,本文首先提出了异构多核的详细设计方案,然后介绍了此方案在仿真平台上的具体实现步骤和结构细节,最后通过在异构多核上运行程序,将得到的数据结果进行分析和比对,验证了此结构的有效性。
2.异构设计方案
本文所设计的异构多核结构利用了可配置处理器和指令集扩展方法。首先配置需要的处理器,然后根据所要执行的多线程应用程序的特点进行有方向性的指令集扩展,从而得到预想中的异构多核结构。
该结构是一种类似于主从式的异构多核结构。下面是此结构的简单示意图。
该结构中,有一个主核(Master Core),它包含了所有的指令集(ISA1,ISA2,ISA3...)。另外还有一些辅助核(Supporting Core),这些处理器虽然各自包含不同的指令集。可以明显看出,指令集ISA1是大家所共有的,另外每个辅助核都还拥有属于自己的独特的指令集(ISA2,ISA3...),因此,我们把ISA1称为“基础指令集”,而ISA2,ISA3,等都称为“扩展指令集”。不同核之间指令集包含关系,可以参考下图示意:
在图【1】中并没有指定共有多少个辅助核,因为这是可变的,可以根据不同的需求来决定最终的结构。这也正是此结构的可扩展性所在。另外,每一个处理器都拥有自己cache,所有的处理器通过片上总线连接起来,并且共享一块内存[4][5]。
图1 异构多核设计方案
3.实现异构多核方案
3.1 配置生成XTSC Core
在已经实现的异构系统中,采用了如下配置的Tensilica XTSC Core:
五级流水线结构,采用Xtensa ISA LX2.1指令集,32位指令字,32个通用寄存器(32位),16k指令及数据Cache,支持计时器和中断,支持指令预取。
3.2 Mutek与Motion JPeg
3.2.1 Mutek
Mutek是被移植到了异构多核平台上的类Linux操作系统,拥有轻量级内核,仅包含必要的系统功能。由4个部分组成,而在被移植的Mutek操作系统中,最关键的是调度部分,它需要处理异构多核中程序的调度问题。
3.2.2 Motion JPeg
Motion JPeg是视频编解码的一种协议,其解码程序的实现中包含着6个代码模块,模块之间是串行关系,代表了一帧图像的整个解码流程。下面是Motion Jpeg解码程序的基本模块图,描述了6个模块之间的关系:
由于程序在解码过程中,相邻帧之间不存在相关性,因此其复杂度相比于其他的视频编码格式(如H.264)要降低了不少,换来的是更高的并行性。
3.3 结构实现及结果分析
3.3.1异构结构确定及实现
图3 Motion Jpeg解码模块图
由图【3】可知,Motion Jpeg拥有6个模块,我们首先按照模块将其划分为6个线程,在PC机上运行并分析结果,发现IDCT和CONV部分是最耗时的,它们加起来超过了程序运行总时间的80%(见图【6】左),而其他线程则相对比较平均。基于此特点,我们选用了一个3核的异构结构,其中两个辅助核分别运行IDCT和CONV线程,而另外的4个模块合并为一个线程,放在主核上运行,结构的示意图如下。此结构与之前设计部分所提到的结构框架基本相同,只是在共享内存之上添加了一个Arbiter,避免了多核因同时访问内存而可能造成的错误。
图6 Motion Jpeg TIE指令扩展前(左图)后(右图)线程执行时间比例图。
对于此结构需要重点解释的是扩展指令集。我们采用TIE(Tensilica Instruction Extension)定义一些新的扩展指令,其中每一条扩展指令在功能上都等同于一些基础指令的合集,而其运行时间又比这些基础指令要短的多。
如图【4】所示,三个核都共享ISA1,这XTSC Core本身的基础指令集。Core #1还包含ISA2指令集,这是针对IDCT做的指令集扩展:IDCT中有大量的行列乘加运算,我们把这部分的代码提取出来,把原来循环中嵌套的多个乘加操作替换成了TIE指令,保证了每个循环只需要4个周期就可以完成,而不是原来的上百个周期。
类似的, Core #2包含了针对于CONV的ISA3指令集:CONV部分包含了对图像中颜色信息的处理,原来的代码中需要使用多重循环嵌套的方式来实现,我们将循环中可以并行的部分抽取出来,分别用TIE的指令实现,使得新编写的CONV线程代码中减少了循环的层数,且每次循环所消耗的时间也缩短了。
图【5】说明了Motion Jpeg中每个线程到异构系统中每个处理器上的映射关系:
3.3.2 结果分析比对
我们将指令扩展后的Motion Jpeg程序在此异构结构上运行,得到了下面的各部分运行时间统计比例图。
可以明显看出在使用TIE后,处理IDCT和CONV的时间比例大幅减少。程序运行总时间也缩短为原来的40%。我们还针对执行IDCT和CONV部分的辅助核进行了数据统计:
从表1可以看出,通过指令扩展,CONV部分执行的加速比超过了3倍,而IDCT部分的加速比几乎达到了4倍。
表1 IDCT Core (Core #1)及CONV Core (Core #2)执行数据统计
为了检验我们对于Motion Jpeg程序划分的正确性,我们将其进行了另外的两种划分:a)一种将IDCT单独作为一个线程,剩下的部分全部作为一个线程(共2线程),使用Master Core + Supporting Core #1的结构;b)另一种将IDCT和CONV分别作为两个线程,把Demux、VLD和IQ/ZZ以及LIBU分别作为两个线程(共4线程),使用Master Core + Supporting Core #1 & #2 + XTSC Core的结构。各自运行改造过的Motion Jpeg,与c)前文所述结构比较,得到如下的数据(其中的门数信息由Tensilica仿真器提供):
表2 Motion Jpeg不同线程划分的执行结果比较
从表2中可以看到,对于线程划分少的情况(a),占用的硬件资源最少,但解码率也最低;而线程划分最多的情况(b),解码率很高,同时占用硬件资源也很高;综合下来,性价比最高的正是前文所述的结构。
最后,我们还将此异构结构与一个“超级同构结构”(含有3个主核)、一个单核的Master Core以及一个未经过TIE扩展的XTSC Core进行了对比。下面是结果数据比较:
表3 不同结构运行Motion Jpeg结果对比
从表3中的数据可以看出,同构结构确实得到了很好的执行效果,但它占用的硬件资源非常庞大,几乎是异构结构的1.5倍;而单核的Master Core虽占用资源少,但其解码效果相比异构结构要差很多,单核XTSC Core的性价比虽然不错,但是解码率太低。因此从性价比和解码率方面综合权衡,异构多核结构拥有绝对的优势。
4.结论
本文描述了一种针对某一类应用的异构多核结构的设计方案,以及其在Tensilica平台上的实现。并且通过在该结构上运行指令扩展优化后的Motion Jpeg程序,将得到的数据与指令扩展前的程序以及同构多核的执行情况分别进行比较,显示出了该异构多核结构在实际应用中的高效执行能力。
陈劭 付宇卓
上海交通大学微电子学院
文章评论(0条评论)
登录后参与讨论