文献标识码:A
DOI:10.16157/j.issn.0258-7998.182489
中文引用格式:韩孟桥,蒋林,杨博文,等. 移动图形处理器的纹理Cache设计[J].电子技术应用,2019,45(5):17-22.
英文引用格式:Han Mengqiao,Jiang Lin,Yang Bowen,et al. Design of texture cache for embedded mobile graphics processing unit[J]. Application of Electronic Technique,2019,45(5):17-22.
0 引言
随着手机、PAD等移动设备进一步普及,对3D图形绘制的需求也越来越大。桌面GPU相较于移动GPU,其渲染流程简单直接、数据吞吐率高,进而带宽需求高,功耗大。文献[1]指出相比于集成电路按照摩尔定律的发展速度,电池供电技术发展得缓慢得多,移动设备最基本的问题是电池供电。在移动设备中,由于图形应用于液晶显示器上,因此图形渲染时系统功耗大,软件的优化是有限的,所以对硬件的低功耗设计是研究的重点,进而达到移动设备在低带宽功耗的条件下实现较高性能的渲染效果。
纹理映射是纹理空间与像素空间相互映射的过程,在对纹理图形进行放大或缩小时,会出现单纹素对应多像素或多纹素对应单像素的情况,造成纹理走样的现象。因此,行业内权威共同制定了适用于嵌入式的3D图形标准OpenGL ES[2],其使用各向同性滤波方式。该方式中的最近邻点采样滤波因没有考虑到纹理映射的范围,容易产生锯齿现象;该方式中的双线性滤波虽然有效地减少了锯齿问题,但容易造成模糊现象;该方式中的Mipmap滤波是经典的映射方法;最后的三线性滤波是对Mipmap滤波的优化,所以本文选择了三线性滤波。因为双线性滤波是对邻近d的一层纹理图像中相邻的四个纹素位置进行采样,三线性滤波是对邻近d的两层纹理图像分别进行双线性滤波,并将两层的双线性滤波加权,进而双线性滤波是三线性滤波的简化,本文以下用双线性进行说明。
纹理访存是影响像素处理器速率的关键,同样也是移动GPU整体性能的瓶颈。加上片上纹理高速缓冲存储器,建立关于纹素的片上L1缓存,有效降低了移动GPU与外存间的数据带宽。纹理Cache与普通Cache的不同:首先,纹理Cache为只读,区别于普通Cache的写数据和写回功能;其次,纹理Cache的吞吐率同移动GPU整体性能结合紧密,本文结合双线性滤波需要四纹素的特点,使用4端口Cache。纹理Cache是流水线形式,本文使用FIFO控制器控制FIFO缓冲区预存块的读写,减少了移动GPU流水线的停顿。
1 基于Tile-based的移动图形处理架构
Imagnination公司PowerVR系列产品的移动GPU采用文献[3]提出的TBR(Tile Based Rendering)渲染模式,在几何运算后将屏幕像素点划分为多个Tile,并在像素处理器中逐Tile进行渲染。相比于适用于桌面图形处理器的立即渲染模式(Immediate Mode Rendering,IMR),TBR渲染模式在执行光栅化和图元操作时可以将每个Tile上所有的深度及颜色等信息都存在片上,显著降低了存储带宽。文献[4]指出移动GPU主要的功耗来源于访问片外存储,所以TBR模式适用于移动图形处理器。图1为本文移动图形处理器的体系结构。
整个移动GPU采用了统一架构,即几何变换操作、顶点坐标的光照计算和着色渲染都在统一渲染染色器(Unified Shading Processor,USP)中完成;屏幕坐标产生单元(Screen-coordinate Generating Unit,SGU)完成几何处理后顶点的图元装配、裁剪、背面剔除等操作,转换到屏幕空间;后续模块为覆盖率计算、中间数据缓存建立等;最终通过深度测试输出给帧缓存。TBR渲染模式中,Tile的大小有8×8、16×16、32×32等多种划分方式,文献[5]指出当Tile大小为8×8时,纹理Cache的性能可以达到最优,但从移动GPU整体性能方面考虑,一般应采用Antoeh[6]建议的32×32大小的Tile。
2 纹理滤波
纹理映射是将二维图像投影到屏幕的三角形上,在移动GPU中,这一过程是逆向处理的,即对每个在屏幕上的像素点,计算其对应于二维图像中的纹理坐标。但屏幕空间对应到纹理空间时,不一定恰好对应到一个纹素,而是对应到纹理空间中某个区域,这时就需要对该区域中的纹素进行加权计算,这就是滤波。
Lance Willams提出了一种目前几乎所有图形硬件都会支持的滤波方法,即Mipmap滤波技术。图2(a)所示为Miapmap金字塔,其核心内容如图2(b)所示,将不同分辨率的纹理存储在外存中。在映射时,根据纹素与像素的缩放率d,选择适合的层级,对于较小的多边形映射,可以有效降低纹理走样的出现。
在Mipmap滤波的基础上,进一步提出了三线性滤波,显著降低了走样现象的产生。首先,计算缩放率d;其次,在d的上下两个不同分辨率纹素层级中分别读取4个纹理坐标并进行双线性滤波;最终,对两个结果进行加权。
3 纹理Cache的设计
3.1 纹理Cache电路
纹理Cache的硬件电路结构如图3所示,主要包括:LUT查找电路、地址判断电路、标记位比较电路、LRU替换电路、FIFO控制电路和输出电路。
3.2 查找电路
查找电路负责计算双线性滤波所需要的四个纹素在外存中的地址。通过查找表(Look Up Table,LUT)给出纹理图像所在Mipmap金字塔中的层级,将其输出给地址判断电路、标记位比较电路、LRU替换电路和输出电路。
在三线性滤波中,由纹素和像素的缩放率d可以得到两个不同且相邻Mipmap层的纹理图像,即每个纹理图像的基地址addr0是由纹理ID和Mipmap层共同决定的。本文中USP支持最大分辨率纹理图像为1 024×1 024,对应层级数为0,依据金字塔中每级的纹理图像分辨率需要满足2n×2n的大小,则层级数为1对应的纹理图像分辨率为512×512,以此类推。
3.3 地址判断模块
地址判断模块根据基地址信息,计算出双线性滤波中另外三个纹素所在外存中基于基地址的偏移地址,并把整合后的四个纹素地址连续地输出给标记位比较电路和输出电路。
本文最大支持1 024×1 024分辨率的纹理图像,每个纹素按照RGBA8888格式存储,即32 bit。在纹理图像中的偏移地址按照oa形式产生:
图4表示使用MATLAB将一幅纹理图像恢复成RGBA格式并存储在外存中,比如大小为64×64,方格代表纹素在纹理图像中的位置,数字代表纹素在内存中的位置,对该层级分辨率纹理图像进行双线性滤波时,需要读取2×2个纹素,如图4中圈所示。假设Address表示外存中的地址,则另外3个纹素在外存中的地址分别为:
根据纹素在纹理图像中的映射方式,提前进行四纹素地址判断有两点优势:
(1)例如图4中1、2、8、9四个纹素地址分别为Address(0~3),其中1号纹素地址为给定的基地址,8号纹素地址通过偏移量可直接计算,2号和9号纹素的地址只是前两个纹素地址各自加“1”,进而在进行标记位存储时,只需存储1号和8号的信息,减少了资源的浪费;
(2)根据标记位比较电路的设计,减少了检测时间的消耗。
3.4 标记位比较电路和LRU替换电路
标记位比较模块负责判断四个纹素在纹理Cache中是否命中。为了满足提高数据吞吐率,使用4端口纹理Cache,把256行的纹理Cache分成4个64行的单端口Cache(0~3)。在纹理贴图中,分辨率小于32×32的纹理图像相对使用较少,为了提高常用纹理图像中纹素的命中率,可以把分辨率较小的纹理图像的纹素单独存储在Cache3中,把分辨率较大的纹理图像的纹素通过Address中的7、8位对四个Cache进行选择,从而在不命中的情况下,不会替换其余Cache中的块。
文献[7]指出纹理Cache大小为8 KB时,可以达到很高的命中率,因此采用8 KB的存储容量。在地址映射关系中,直接映射速度快,但对存储空间的利用率低;全相联映射与直接映射相反,进而在地址映射上,选择折中的组相联映射方式。本文采用4路组相联,即将每个64行的Cache分为16组,其中每组分为4路,每行存储8个纹素,大小为32 B。
如果对一个Cache某组中的4路进行tag位检测,会花费1~4拍,影响吞吐率。将每组中的第一路组成tag_ram0,以此类推,第四路组成tag_ram3。如图5所示,则:
(1)当读取分辨率较小的纹理图像时,只在Cache3中进行tag位检索,需要2拍完成;
(2)当读取分辨率较大的纹理图像时,通过地址选择Cache,在Address[7:8]都为0的情况下,tag检测需2拍;
(3)在Address[7:8]不都为0的情况下,tag检测只需1拍。
LRU替换电路主要负责在读不命中情况下,判断Cache组中需要被替换的路。采用最近最少使用算法(Least Recently Used,LRU)。
3.5 FIFO控制电路
为满足USP高处理速度,纹理Cache的读取速度不仅体现在命中率、多端口上,更多地时间消耗在与外存间的数据交互中。因此,如果能够提前将未命中且待读取的数据提前放在片内,将会显著提高吞吐率。
纹理Cache中对标记位检索可以有较高的处理速度,因此如图6所示,在纹理Cache上建立一个标记位FIFO和一个数据buffer或FIFO,由于四纹素的地址已经提前计算出,返回数据和请求数据发出的先后顺序是一致的,所以本文可以使用Data_fifo来代替buffer,分别用于存储未命中地址和待读取数据的提前存储。
在标记位FIFO有未命中地址写入时,FIFO控制器直接向外存发送读请求地址,并写入到Data_fifo中。因为命中率和Data_fifo深度为反相关关系,所以Data_fifo深度不大,当其写满时,把到达FIFO头部的数据开始写入Cache_ram对应行中,并读出。
纹理Cache流水线暂停的条件是:tag_fifo被写满,发送stop信号给USP,在全部处理完后,再发送begin信号,启动流水线。其中tag_fifo与Data_fifo深度一样。
3.6 地址判断电路
输出电路负责与外存和USP间的数据交互及纹理Cache中RAM的更新。其存储方式与3.4节中讨论相同。
在读全部命中时,直接读取数据给USP;在有不命中时,即使有命中的纹素也暂停等待Data_fifo深度被写满,然后接收FIFO数据更新RAM,并读出数据。
4 实验结果
4.1 测试平台的搭建
本文的测试平台使用SV进行搭建,如图7所示,该平台主要包括:generator(激励模块)、driver(驱动模块)、dut(RTL级代码)、reference_model(参考模块)、monitor(监视模块)、scoreboard(比较模板模块)。
验证平台描述:激励模块主要用来模拟产生USP发送的读请求地址,给出地址大小区间,并在该区间内随机循环产生地址输出到驱动模块;驱动模块将输入的地址分别输出到dut和参考模块,其中dut是纹理Cache的RTL级代码部分,参考模块通过平台与C参考模型接口,把地址送入模型中计算,并通过接口输出到平台;监视模块监视整个测试过程中的信号;比较模板模块把从参考模块输入的数据和监视模块输入的数据进行比较,相同则表示“success”,并把次数自增加“1”,不同则表示“fail”,并使次数不变。
4.2 性能分析
首先编写几种典型的测试机理,通过EDA工具对RTL级设计进行功能仿真,在测试激励仿真正确后,将代码加入测试平台中,进行平台测试。最终与USP IP及Xilinx定制存储器IP互联,使用Xilinx的ZYNQ-7系列xz7z045ffg900开发板进行硬件测试。图8所示为硬件平台中USP IP与本文设计的纹理Cache IP的互联,并将恢复出的纹理图像通过驱动HDMI显示出来。图9是测试场景渲染图。
通过Xilinx的Vivado对设计进行综合,综合资源结果如表1所示。
本文从接收到读地址到发送纹素给USP的拍数如表2所示。
在读命中时,如果纹素存储在同一单端口Cache中,需3拍读出4个纹素;如果纹素两两存储在不同Cache中,只需2拍读出。在读不命中时,当缓冲区已经写入未命中数据,则只需6或7拍即可,因为有Cache号的问题;当缓冲区为空,则只能读取外存纹素先写满FIFO,需35或36拍完成。
通过MATLAB将20幅纹理图像恢复成RGBA格式存储,用generator模块产生地址测试,验证结果为平均命中率可以达到92.5%左右。吞吐率相比单端口Cache提升了将近4倍,相比于文献[8]中的平均像素生产率0.1 pixel/clock,提高了8倍左右。表3是实验数据,表4是命中率比较。
本文设计的纹理Cache应用预存块,减少了流水线停顿;使用4端口结构,消除了Cache同步问题,显著提高吞吐率;结合Mipmap算法特点,提前计算出四纹素的外存地址,根据纹理图像的层级大小,选择Cache进行纹素的存放。本文相比于文献[9]平均命中率有所提高;相比于文献[10]对于最大分辨率1 024×1 024的纹理图像命中率有所提升。
5 结论
为了满足统一架构染色器对吞吐率的要求,结合双线性滤波算法的特点,本文设计实现了一种纹理Cache的电路结构,并通过测试平台及Xilinx的FPGA开发板进行硬件测试。通过层级选择纹素在Cache中的存储方式,提高对相同纹理图像不同分辨率读取的命中率;FIFO缓冲区和4端口结构的设计,提高了Cache的吞吐率及降低流水线停顿。根据测试结果表明,本文提出的纹理Cache性能良好。
参考文献
[1] 焦继业,李涛,杜慧敏,等.移动图形处理器的现状、技术及其发展[J].计算机辅助设计与图形学学报,2015(6):1005-1016.
[2] CHOUDHARY V,KUMAR P,BHATTACHARYA T K,et al.Alternative geospatial data handling and augmented reality[C].IGN e.V. a BOW,2008.
[3] ANTOCHI I,JUURLINK B,VASSILIADIS S,et al.Memory bandwidth requirements of tile-based rendering[M].Computer Systems:Architectures,Modeling,and Simulation.Springer Berlin Heidelberg,2004:323-332.
[4] JAKO B.Hardware accelerated hybrid rendering on PowerVR GPUs[C].IEEE,Jubilee International Conference on Intelligent Engineering Systems.IEEE,2016:257-262.
[5] JUURLINK B,ANTOCHI I,DAN C,et al.GRAAL:a framework for low-power 3d graphics accelerators[J].IEEE Computer Graphics & Applications,2008,28(4):63-73.
[6] 许强,陈杰,刘建,等.一种适用于嵌入式图形处理器的多端口纹理Cache的设计[J].微电子学与计算机,2013(11):27-30.
[7] LIOU J Y,CHEN C H.Re-visit blocking texture cache design for modern GPU[C].SoC Design Conference.IEEE,2015.
[8] 程龙,郭立,史鸿声.一种纹理映射算法的FPGA实现[J].小型微型计算机系统,2009,30(9):1855-1859.
[9] 许强,陈杰,刘建,等.一种适用于嵌入式图形处理器的多端口纹理Cache的设计[J].微电子学与计算机,2013(11):27-30.
[10] MISAKI Y,INO F,HAGIHARA K.Cache-aware,in-place rotation method for texture-based volume rendering[J].IEICE Transactions on Information & Systems,2017,100(3):452-461.
作者信息:
韩孟桥1,蒋 林2,杨博文1,山 蕊1,耿玉荣3
(1.西安邮电大学 电子工程学院,陕西 西安710121;
2.西安科技大学 集成电路设计实验室,陕西 西安710054;
3.西安邮电大学 计算机学院,陕西 西安710121)