时间:2024-05-04
谢晓燕,芦守鹏,邓军勇,田汝佳
(1.西安邮电大学 计算机学院,陕西 西安 710061;2.西安邮电大学 电子工程学院,陕西 西安 710061)
近年来,随着对移动电子设备上视频和图像质量以及游戏效果的要求越来越高,导致对处理器性能的需求也逐步增加。由于传统的移动CPU并不擅长处理图形数据,为提高系统的整体性能,移动GPU(mobile graphics processing unit)应运而生。而在图形渲染流水线中,模型视图变换是重要的处理环节,用来实现对屏幕中的物体进行平移、旋转和缩放的处理。由于模型视图变换的本质是实现矩阵的乘法,相比于使用串行的方式实现矩阵乘法,高效率的并行算法更能减少处理整个图形渲染流水线系统的时间。
针对基于可重构系统对图形渲染流水线中各种图形变换进行并行计算的实现,国内外学者提出了很多设计方案。文献[1]在可重构系统上实现了4×4矩阵向量的乘法,并在FPGA器件上进行了原型设计和验证,其优点在于可以将图形流水线中的各种变换和渲染映射到可重构阵列上,但是对于形流水线中的变换只是用了一个矩阵处理模块,而对于模型视图变换的三种矩阵只能相继串行处理,不能同时输出三种矩阵的输出结果。文献[2]利用了FPGA硬件电路专门针对模型视图变换中缩放矩阵的执行过程进行映射,其使用六个乘法器以并行的方式对矩阵乘法进行运算,这比基于通用处理器实现的软件解决方案更有速度和效率上的优势,但是缺点在于使用电路中固定功能的模块处理了二维缩放矩阵,并且未对模型视图变换中的三维平移和旋转做处理。文献[3]提出了3DAT(3D仿射变换)算法的流水线架构,其中将模型视图中平移、缩放、旋转矩阵的计算过程使用并行算法映射到FPGA开发板上,相比于传统算法,其算法的加速比增大,但是专用硬件模块的功能单一,如果改变其中的算法配置,则会影响整个图形渲染流水线的实现,相比于可重构的方法,其算法架构不够灵活。文献[4]是在多核架构的通用处理器上对形如C=AB形式的稀疏矩阵乘法进行并行计算,而对于图形流水线中各种变换涉及到的都是稀疏矩阵的乘法,所以具有很好的算法启示作用,但是通用处理器上的软件解决方案需要高级语言和处理器驱动的支持,这无疑增加了中间层处理和编译的时间。
综上所述,目前设计和实现图形渲染流水线中各种图形的变换大多在FPGA上使用硬件编程实现。当处理图形变换算法的并行映射时,需要事先布局设计好电路中各个模块的功能再用硬件描述语言对电路及接口进行编程,最后进行综合仿真,如果需要修改电路中某个模块的算法,则会影响其他模块的功能实现,此时需要对电路进行修改再重新综合。因此这种实现方案会导致电路中的模块功能固定,使得设计和实现算法的周期过长,工作量较大。
基于上述情况,在可重构的阵列结构上使用软件编程的方法将模型视图变换的任务分成三个矩阵相乘的子模块,在任务运行的不同阶段根据计算的需要分别重新配置相应的模块,而那些不需要重新配置的模块则不会受到影响。而且在使用汇编语言控制硬件时,对矩阵并行计算进行编程的过程中只涉及对寄存器和共享存储的读写操作,只有在与外围电路进行数据交互时才涉及到电路及接口的操作,这样就增加了系统的灵活性并体现了基于可重构系统使用软件编程的优势。因此在实现相同模型视图变换的功能且其实现后的性能与硬件实现的性能相差不大的前提下,有必要在可重构的阵列结构上灵活配置PE的资源完成矩阵并行算法的映射。
文中采用的可重构阵列结构[5]是由多个阵列处理器簇(processing element group,PEG)构成,其中每个簇是由4×4个轻核处理单元(thin-core processing element,TCPE)组成。每个PE可以完成加、减运算以及与、或、非和跳转运算。相互临近PE之间的数据交互采用邻接互联的方法实现;不相邻PE之间的数据交互采用共享存储RAM(random access memory)的方法。可重构PE阵列的结构如图1所示。
图1 可重构PE阵列结构
在模型视图变换[6-8]的过程中,图像中的每个新位置点都是通过对原位置点进行矩阵计算得到的。设矩阵变换前的坐标为(x,y,z,1)T,矩阵变换后的坐标为(x',y',z',1)T。
(1)
缩放函数glScale(x,y,z)是指对物体沿着x,y,z轴分别进行放大缩小,函数中的三个参数分别是沿着x,y,z轴方向的缩放系数。设矩阵缩放的比例变换因子分别用Sx,Sy,Sz表示,矩阵变换关系如式2所示。
(2)
旋转函数glRotate(angle,x,y,z)表示模型旋转,angle指定模型旋转的角度,且后三个变量表示以原点(0,0,0)到点(x,y,z)的连线为轴线逆时针旋转物体。以模型绕z轴旋转为例,设旋转的角度用θ表示。则矩阵变换关系描述如式3所示。而模型绕x轴和绕y轴的矩阵变换关系可同理推得。
(3)
基于上述三种变换,可以引申出图形的复合变换,即两种或者三种变换的叠加,实质表现为变换矩阵相乘的形式。由于矩阵并不符合交换律,所以这三种变换按各种顺序执行,结果是不相同的。由于缩放变换和旋转变换并不改变原点的位置,所以在实际应用中,一般按照先缩放再旋转最后平移的顺序进行,这样才能获得预期的变换效果。
由于在模型视图算法中涉及到上述三个矩阵的计算,如果采用传统的串行算法去计算矩阵,会使得多个PE进行长时间的等待,造成处理器资源的浪费。而且在对矩阵最终元素值的计算中,并无数据的相关性,所以应该使用并行算法提高整个算法的运行效率。此外,根据可重构阵列结构的特点,将模型视图算法映射到PE阵列上时,是基于最大并行化原则分配PE资源,每个PE处理算法中的一个子任务,最后将这些子任务的数据进行拼接处理,相比硬件电路固定的功能实现,可重构的设计实现了灵活的算法映射。
2.2.1 数据的准备
根据可重构阵列处理器邻接互联[9]的机制,并通过阵列处理器外围PE的共享寄存器将坐标数据送入阵列处理单元。由于此并行算法需要使用两个簇PEG00和PEG01的资源,所以数据应根据计算的需要分别输入到两个簇相对应的PE共享寄存器中。基于图1的PE阵列结构,在第一个簇PEG00中的图原顶点x、y、z坐标连续赋值给PE00的R5共享寄存器;缩放矩阵沿着x轴方向的缩放系数Sx赋值给PE10的R5共享寄存器;缩放矩阵沿着y轴方向的缩放系数Sy赋值给PE01的R6共享寄存器;缩放矩阵沿着z轴方向的缩放系数Sz赋值给PE02的R6共享寄存器。平移矩阵沿着x轴、y轴、z轴平移的数值dx,dy,dz连续赋值给PE33的R7共享寄存器。在第二个簇PEG01中的图原顶点x、y、z坐标连续赋值给PE30的R5共享寄存器;CORDIC算法的向量(K,0,θ)连续赋值给PE00的R5共享寄存器;平移矩阵沿着x轴、y轴、z轴平移的数值dx,dy,dz连续赋值给PE33的R7共享寄存器。
2.2.2 数据的拆分
基于上述将并行化计算过程分为四大部分,依次为数据的准备、数据的拆分、平移矩阵和缩放矩阵的计算、旋转矩阵的计算。因为在可重构阵列处理器中,其数据位宽是32位,且待处理的顶点数据也是32位,为了避免出现做乘法后的溢出错误,需要对计算的数据进行拆分,需要拆分的数值有x、Sx、y、Sy、z、Sz。以数值x和Sx举例,将x拆分为高10位-xH10、中间10位-xM10和低12位-xL12,将Sx拆分为高20位-SxH20和低12位-SxL12,然后分别对每部分进行交叉乘法操作:xH10*SxH20、xH10*SxL12、xM10*SxH20、xH10*SxL12、xL12*SxH20、xL12*SxL12,最后将每部分的计算结果通过移位加的方法拼接成正确的结果。
2015年10月,盛通印刷参股一家从事教育出版策划和发展的公司;2016年4月发布重大资产重组草案,拟用4.3亿元人民币并购少儿机器人教育公司——乐博乐博,致力于4~12岁青少年思维模式及动手能力方面的教育。通过几次参股和并购,盛通印刷悄然完成了业务的大转型,未来的市场格局更加清晰。
2.2.3 平移矩阵和缩放矩阵的计算
由于第一个簇PEG00负责计算平移矩阵和缩放矩阵,而需要实现的图形效果是这两种矩阵相乘的复合变换,即先缩放后平移,因此在矩阵计算的过程中存在数据相关性,需要先并行计算缩放矩阵,然后再串行计算平移矩阵。
首先计算缩放矩阵,需要15个PE使用邻接互联或者远程访问共享存储的方式读取数据再进行拆分,然后并行计算缩放矩阵,最后将这些待拼接的计算结果分别保存在该PE的本地存储中。由于需要对缩放后的新图原顶点坐标进行平移,所以先将并行计算得到的15个待拼接结果分组保存到RAM31、RAM32、RAM23中,然后使用移位加的方法同时在上述PE中进行拼接。以X*Sx拼接的过程为例,过程如下:(XL12*SxH20)≪12,(XH20*SxM10)≪24,(XH20*SxH10)≪34,(XH20*SxL12)≪12,(XL12*SxL12)≪0,最后将这些结果在PE31中相加即可得到X*Sx的正确结果。对于Y*Sy和Z*Sz可通过PE32和PE23分别采用相同的处理方法。全部拼接后可得到3个正确结果,即旋转后的图原顶点坐标,并将其转存到RAM33中。在PE33中再使用ADD指令以串行的方式计算X*Sx+dx、Y*Sy+dy、Z*Sz+dz,此时形成缩放后平移的图原顶点坐标,最后将其存放到PE33的寄存器中,等待外围电路读取数值时调用。具体的平移变换矩阵和缩放变换矩阵的整体映射过程如图2所示。
图2 PEG00算法映射
2.2.4 旋转矩阵的计算
由于第二个簇PEG01主要负责计算旋转矩阵并且需要实现先旋转后平移的图像效果,分析可知中间存在数据相关性,所以也需要运用串行与并行相结合的方法,具体执行过程如下:首先使用CORDIC算法[10-11]串行计算出旋转角的正弦值和余弦值,然后将这两个值就近存入当前PE的RAM中,接着并行计算旋转矩阵从而得到新的图原顶点坐标,最后以串行的方式对新坐标值进行平移。
(4)
其中,Ri、Ti、Wi是当前迭代的变量,而Ri+1、Ti+1、Wi+1是下一轮迭代的变量。
随着迭代次数的不断增加,其计算精度也会不断增加。对于N位精度的CORDIC算法,迭代次数[12]M应该满足式5。若N=15,可以得到M=5;若N=31,可以得到M=10。
(5)
所以基于文中提出的可重构PE阵列结构的位宽,CORDIC算法使用移位、加减法的优点以及迭代算法的特点,在第二个簇PEG01中使用PE00串行计算正余弦值,在计算过程中使用10次迭代,前一次的计算结果为下一次的迭代计算做准备,直到第10次计算出正弦值和余弦值。当计算出正弦值和余弦值后,将值存入PE00的存储器RAM00中,然后通过邻接互联或者远程共享存储的方式将正弦值或余弦值存入相对应的12个PE中,最后并行计算Xcosθ、Xsinθ、Ysinθ、Ycosθ、Zcosθ、Zsinθ的各个分量。由于需要对旋转后的新图原顶点坐标进行平移,所以先将并行计算得到的待拼接分量通过STI指令分别存到RAM31、RAM32、RAM33中,然后使用移位加的方法同时对上述各分量进行拼接,拼接后得到6个正确的结果。
以模型绕z轴旋转的矩阵为例,将拼接好的Xcosθ、Ysinθ、Xsinθ、Ycosθ和Z坐标这5个数值全部转存到RAM33中,然后在PE33中通过ADD和SUB指令就可计算出式3中旋转矩阵的元素值,此时即可得到旋转后的图原顶点坐标,最后利用RAM33中的平移数值dx,dy,dz对此图原顶点坐标进行平移处理。而模型绕x轴旋转和模型绕y轴旋转的矩阵计算方法同理可得。最后将平移处理后的三种结果存放到PE33的寄存器中,等待外围电路调用。旋转矩阵的整体映射过程如图3所示。
图3 PEG01算法映射
为了验证文中设计方法的可行性和正确性,将实现的方案接入文献[13]所提的结构中,并使用Xilinx的FPGA芯片XC6VLX760T进行原型验证并显示图像。图像对比结果如图4所示,上图为FPGA平台的输出结果,下图为Linux平台的输出结果。实验可表明两种平台的输出结果一致。
基于所使用的串行和并行相结合的算法,需要计算采用并行方式处理矩阵的加速比,所以应根据Amdahl定理[14-15]给出式6:
(6)
其中,f表示可被并行处理部分的比例;m表示并行处理机的数量。并设CPI(每条指令执行需要的平均时钟周期数)为T。
图4 输出图像结果对比
由于文中使用32个轻核处理单元则m=32,并使用表1的参数可得f=125T/157T≈0.79,代入式6可得加速比约为4.26。与文献[1]具体的参数对比分析如表1所示。文中与文献[1]都是在将4×4的矩阵变换映射到FPGA硬件平台上,但是文献[1]只针对通用矩阵,而且当处理旋转矩阵中的旋转角时,只能处理特殊角度的正余弦函数,而文中可以处理任意旋转角度的正余弦函数值,且加速比也优于文献[1]。
表1 效率对比
项目文中文献[1]硬件平台Xilinx FPGAStratixII FPGA电路结构PE阵列结构RISC矩阵维度4×44×4总时钟周期157T196T可并行周期125T65T加速比4.263
文献[2]仅仅是处理二维的缩放矩阵,即将3×3矩阵的算法并行映射到硬件平台上,而文中处理的是4×4的三维多功能矩阵,电路工作频率也高于文献[2],具体的对比参数如表2所示。
表2 性能对比
由于可重构配置可以实现接近专用硬件系统的性能,还能保持通用处理器的灵活性,所以文中采用可重构多PE的阵列结构,设计了矩阵并行映射的方法,并在Xilinx的Virtex6系列的FPGA开发板上进行了原型验证。
实验结果表明,提出的模型视图变换单元并行化映射方法,能够正确地将所绘制的图形进行平移、旋转、缩放三种独立的变换以及它们的复合变换,而且使用阵列结构并行计算矩阵的过程与专用硬件实现性能相当,其编程灵活性也大大提高并更加实用。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!