请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 3339|回复: 4

论文学习分享.嵌入式图形处理器设计 [复制链接]

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2014-8-22
积分
1292
发表于 2014-10-8 22:22:26 |显示全部楼层
本帖最后由 titer1 于 2014-10-8 22:37 编辑

一直在学习流水线技术,今天看到如下的论文,从opengl 实现角度 给予具体的讲解,值得深入。


摘要

论文首先回顾了图形处理器的发展历史,分析了图形系统的构成。典型的图
形系统由图形API、GPU的驱动程序以及硬件三部分组成。论文采用 OpenGL 作
为系统的图形API,从中选取 23条常用命令,设计了它们的渲染列表,以此作为
嵌入式GPU的设计规约。在此基础上,定义并实现了与所选命令对应的GPU 驱
动程序,从而将图形API 翻译为GPU 能够执行的渲染列表。论文重点研究了GPU
的核心内容——图形管线的组成和关键算法,根据图形管线的组成设计了GPU
的体系结构,并使用SystemC 在事务级实现了GPU 的概念模型,该模型完成了
图形处理任务里的几何阶段和光栅阶段。通过对GPU 概念模型的细化,可以得到
寄存器传输级的GPU IP软核。

GPU 概念模型的建立和调试工作在Visual C++6.0集成开发环境下完成,经
验证,该模型能够执行所实现的OpenGL API,正确完成三维空间中物体的平移
和旋转变换、光照计算、剔除与剪切、投影以及光栅化等工作

研究目标:

本课题的任务是设计出适合嵌入式系统使用的图形处理器的IP 核。绝大部分
嵌入式系统所使用的GPU 不需要达到当代PC显卡级别的图形处理能力,因此其
设计规模也要远小于PC图形处理器,这样做的目的是为了能够将该 IP 集成到单
片大容量FPGA 中,提高该IP 的实际应用价值。GPU常用的技术参数主要有三
角形的处理速率和像素的填充速率,本课题所设计的嵌入式GPU 的性能参数处于
PC第一代GPU 水平,架构则采用第二代 GPU的固定管线架构,即硬件实现固定
图形管线的几何阶段和光栅阶段,其最终的理想技术参数如下。

(1)  完全支持OpenGL ES Common-Lite 标准。
Common-Lite 标准是在 Common 标准上进一步裁减得到的,是对硬件要求最
低的一个标准图形API 集合。实现这个标准,使得本课题的 GPU 具有很好的通
用性和实际应用价值。

(2)  工作在50MHz时,三角形绘制速率能够达到50万/ 秒的峰值。

这个技术指标是以在FPGA 上实现为前提的,即使是在速度级别最低的-8 级
别的FPGA 芯片上,现有的设计技术也能够保证GPU 的主时钟频率达到50MHz。
GPU 的图形管线分为八个阶段,每个阶段处理单个三角形需要的周期数控制在
100 个以内,总体性能指标可以达到每秒处理50万个三角形。

(3)  像素填充速率能够达到2500万/ 秒的峰值。
现在大部分SRAM 的读写周期都在10ns 以内,选用这样的芯片,SRAM 读
写时钟可以工作到100MHz ,GPU内部工作在50MHz,GPU 内部逻辑与SRAM
写端口之间采用异步FIFO相连接。每像素需要对SRAM 进行二次写操作和一次
读操作( 不包含alpha混合的情况) ,因此SRAM 每秒可以满足约100M/3 = 33M像
素对存储器的读写带宽要求,理论上完全可以达到2500万/ 秒的像素填充速率峰
值。

(4)  逻辑资源消耗在 20000LE 左右,即单片Altera 公司的 2C20 FPGA 可以容
纳。 目前2C20的单片购买价在300RMB 左右,与使用商用嵌入式 GPU相比,价
格优势不明显。但是,随着半导体技术的进步,FPGA 单片容量不断扩大,片上
20000LE 规模的FPGA 芯片价格会不断下降,下调FPGA 的售价也是Altera 和
Xilinx 抢占ASIC市场的一项策略。

本文的工作侧重于GPU 的概念模型设计,其具体研究内容如下。
(1)  研究图形 API,明确它在图形系统中的地位和作用,在此基础上制定GPU
的设计规约。
(2)  研究SystemC 和事务级建模方法,并使用SystemC 开发GPU 的概念模型。
(3)  开发GPU 概念模型的验证环境,对概念模型的功能进行验证。
(4)  为GPU 设计适合其工作的嵌入式系统。
GPU 概念模型的建立为嵌入式GPU 在FPGA 上硬件实现奠定了良好的基础。

论文在第二章详细介绍图形系统的构成,分析了图形API、GPU 的驱动程序、
以及硬件在图形系统中的作用,进一步明确课题的任务。
第三章论述图形处理器的体系结构,  图形处理器的核心为图形管线(Graphics
Pipeline) ,图形管线可分为几何阶段和光栅阶段。本章从总体上介绍图形管线的
原理和组成,并阐述了图形处理器事务级模型的组成。
第四章详细讨论图形处理器的图形管线几何阶段的组成和事务级模型的设计
与实现。
第五章在第四章的基础上,继续讨论图形管线光栅阶段的组成和事务级模型
的设计与实现,最后给出了功能验证的实验数据



GPU 驱动程序摘要
GPU 驱动程序的作用是将应用程序中调用的OpenGL API转换成预先定义好
的渲染列表,并把这些渲染列表发送给GPU 进行处理。
对于前面选择的23条OpenGL API中的每一条,都需要设计与之对应的驱动
程序,  现以其中的1 条API——glVertex3i() 的驱动程序实现


void
SOM_cpu_model::glVertex3i(int x, int y, int z)
{
SOM_real temp;

//debug_start
if(m_verbose)
    printf("INFO: calling glVertex3i().\n");
//debug_end

  temp = SOM_VERTEX<<24;                          (1)

  //issue the command
  SOM_send_command(temp);                          (2)
  //issue vertex data,convert it from int to 16.16 format
  SOM_send_data(x << PRECISION);                    (3)
  SOM_send_data(y << PRECISION);                    (4)
  SOM_send_data(z << PRECISION);                    (5)
  SOM_send_data(1 << PRECISION);                    (6)
}

本课题图形系统的硬件
  GPU为本课题设计的支持OpenGL ES Common-Lite标准的图形处理
器,主要用于承担繁重的渲染列表计算处理任务;CPU 可以采用任何32位的嵌
入式处理器,如 ARM7 、ARM9 或NiosII 等,其主要任务为负责整个系统的控制,
执行图形应用程序,生成渲染列表;DMA 控制器负责将生成的渲染列表批量传
输给GPU ;VGA/LCD 控制器负责生成CRT/LCD显示器的扫描时序信号,并从
帧缓存中读取像素数据交给显示器显示。本系统配备了两块帧缓存,一块用于保
存GPU 当前的绘制结果,另一块用于显示,通过在它们之间的乒乓操作可以保证
整个系统高性能的运转。

图形处理器的事务级模型

图形处理器的事务级模型如图3.4所示,其中加虚线框的部分即为GPU。图
3.4 中包含一个CPU 模型,用以模拟嵌入式系统的CPU 行为,CPU 负责执行图
形应用程序,并通过调用GPU 的驱动程序生成渲染列表。注意渲染列表被直接写
入Fifo ,这里没有通过总线模型和GPU 内部的渲染列表缓冲区来模拟实际的硬件
工作,而是采用了 Fifo ,目的是为了在不影响架构设计的同时,减少编程工作量。
事务级模型中GPU 内部各引擎与图形管线中的各级是一一对应的关系,引擎之间
都用Fifo 通道相连作为各级之间的缓冲。渲染列表首先进入几何变换引擎,到片
段处理引擎时处理完毕。需要说明的是,图3.4 中并未画出帧缓存模块,这是因
为在实际设计GPU 的SystemC 模型时,为了减小编程规模,在片段处理引擎模
块中直接开辟了帧缓存区,这样片段处理引擎只需要将处理结果直接填入本地,
而不用编写总线模型和帧缓存模型来模拟实际的硬件工作情况,做这样的简化不
影响对GPU 体系结构的设计

设计中除法和浮点的考量
一个设计考虑是采用浮点还是定点作为GPU 内部计算的数据格式。使用浮点
格式的一个重要优势就是其能够表达的数的范围大,溢出发生的机会相比定点格
式要小。它的缺点是硬件实现复杂,一个功能完善的实现了加减乘除的浮点处理
单元(FPU) 在FPGA 综合软件Synplify Pro 下综合的结果显示,占用了近 5000个
LE,通常我们使用的低成本大容量FPGA,以Altera 公司的2C20为例,逻辑资
源数目在20000LE 左右,这样的逻辑资源消耗量显然不能接受。即使我们对该
FPU 进行功能上的裁减,以降低其逻辑资源消耗量,但一个向量处理器需要配置
至少四个FPU ,那么这样的资源消耗量变得不切实际。另外,目前大多数中低端
嵌入式处理器没有配置FPU ,因此如果使用浮点数作为数据运算和存储格式,这
些处理器必须使用软件模拟FPU ,必然会降低CPU 的处理能力,基于以上二者
的考虑,我们没有选择浮点格式,而是采用了定点格式。  
课题采用的定点格式是16.16格式,即把 32bit的数据字均分为两半,整数部
分和小数部分各占16bit,定点数据采用 2 的补码形式存放,这样该格式所能表达
的数的范围为-32768.0~32767.9999 ,精度为 1/65536。可以看到,这种格式的整数
表达范围比较小,因此在编写图形应用程序时,要时刻注意给出的坐标数据的绝
对值不能太大(200 以下为宜) ,所以,这种格式的一个很明显的缺陷就是对应用程
序的限制比较大,因为总要考虑到溢出问题。可以用更多bit 表示整数部分,从
而增大整数部分的表示范围,但是小数部分的 bit数不宜过少,考虑 320×240 的
屏幕分辨率,最小精度要求为1/320,需要用9bit 表示小数才能达到这个要求,
除此之外,还需要考虑多次计算后的累积误差,所以说用于表示小数部分的bit
数目不宜太少。

选用该定点格式后,加减运算可以直接使用整型数据格式的运算方式完成。
在处理乘法和除法时需要将得到结果作移位调整,对于两个16.16 格式数的乘法
运算,运算结果为 32.32格式,需要将这个 64bit的计算结果右移 16bit,  然后截
取低32bit 作为最后的结果,注意这样的处理方式直接丢弃了原计算结果的小数
部分的低16bit,这会引入截断误差,多次计算后,累积误差会迅速增加,因此,
后续版本需要考虑采用舍入的方式处理小数部分被丢弃的低16bit。对于两个
16.16 格式数的除法运算,需要首先将被除数左移16bit,然后再与除数相除,这
样可以得到48.16格式的运算结果,最后截取所得结果的低32bit作为除法结果。

图元装配引擎的主要任务

主要任务是把OpenGL 中非GL_POINTS、GL_LINES 以及
GL_TRIANGLES 的其他图元转化为这三种基本图元,经过本引擎的处理,
glBegin/glEnd 之间的图元必定为以上三种基本图元之一,glBegin() 的mode参数
表明了具体是哪种图元。从本级往后,顶点数据都是以图元为最小单位进行处理,
因此,在 glVertex 渲染列表的开头没有必要再保留命令字。如图 4.12 所示,去掉
该命令字,可以减小1/9 的数据带宽需求,从而增加有效数据带宽


三角形图元的光栅化
三角形的光栅化比较复杂,其过程可以大致分为三步。

(a)  将三角形划分为底半部和顶半部,并设置相关扫描参数

    根据三角形三个顶点的屏幕坐标的Y 值,按照从小到大的顺序把三个顶点命
名为vl 、vm 、vh 。作经过vm 的且平行于X 轴的直线,把三角形分成底半部和顶 半部。
    对于底半部,设置其左右两边为lm 和hl ,底半部的Y 轴扫描起点ystart 和扫
描终点ystop 如下计算
    。。。省略

(b)  对于底半部和顶半部,分别设置每条扫描线的左右边界
这一步又可细分为四个操作:
◆光栅化最低顶点vl ,如图5.6 中下方的绿色方格所示,其算法就是光栅化点图
元所采用的方法。
◆光栅化底半部,为包含在底半部内的每条扫描线设置左右边界,在图5.6 中即
c)根据扫描线的左右边界逐行填充三角形,其效果如图5.7所示。

//收获:就是 将三角形扫描 和 点扫描、线段扫描有机结合。详细请见论文,有比较细致的图示表示scanline 算法

光栅化引擎的主要任务是用显示设备的离散的光栅来表示点、线段和三角形
图元。流入本级的是顶点数据,流出的则是片段数据

小结:

论文主要完成了以下工作:
(1)  研究了OpenGL API,从中选择了23 个常用的 API,并定义了它们的渲
染列表,以此作为GPU 的设计规约。
(2)  研究了SystemC 和事务级建模方法,并使用SystemC 开发了GPU的事务
级模型,GPU的图形管线包含几何变换、光照计算、图元装配、剔除和剪切、背
面剔除、投影、光栅化以及片段处理共八级处理。整个 SystemC 模型约12000 行
代码。
(3)  开发了GPU 模型的验证环境,其中包括执行图形应用程序的CPU 模型
和典型的图形应用程序。
(4)  为GPU 设计了适合其工作的嵌入式系统,采用双帧缓存和按需连接的
Slave端仲裁总线结构,确保图形系统的数据带宽满足要求。
分析实验中所绘制的各种图形可知,该GPU 模型能够正确执行本文实现的
OpenGL API。然而,由于时间有限,本文的研究还有一些不尽人意之处,从通用
性和实用性的角度考虑,目前的GPU 模型还必须从以下四点作改进:

1)  完善固定的图形管线。
本文所设计的GPU 属于第二代固定管线GPU,不支持缩放变换、绕任意轴
的旋转变换、聚光灯光源、非无穷远光源以及高级图元。同时,为了进一步减小
工作量,设计的 GPU 暂不支持纹理贴图以及雾、阴影生成等特殊效果。这些功能
在固定图形管线GPU 中都属于必需的基本功能,因此在后续的GPU版本中必须
添加进来。另外,GPU 模型中使用的算法也应该进行优化,从图5.15 中可以看到,
三角形边缘的锯齿非常明显,图5.17 中立方体的表面上有“裂痕”和“黑洞”,
这是因为光栅化算法没有优化造成的。在今后,应该继续学习研究高级的图形算
法并应用到GPU 模型中,努力提高生成图形的质量。
(2)  完全支持OpenGL ES Common-Lite 标准。
本文设计的GPU 只是实现了OpenGL的部分API,还未真正实现符合OpenGL
ES标准的API,但是OpenGL ES作为面向嵌入式系统的标准绘图API,是工业
界的标准,因此后续的 GPU 版本必须向该标准靠拢,直至完全支持 OpenGL ES 。
(3)  增加可编程图形管线。
当今最先进的商用GPU是第四代可编程GPU,它的可编程性体现在其内部
含有可编程的顶点着色器和像素着色器。因此,学习并研究顶点着色器和像素着
色器的设计方法,并把它们加入到后续的GPU 模型中,是以后的发展方向。
(4)  开发GPU 的RTL 模型。
开发RTL 代码是硬件实现该GPU模型的必需步骤,有了 RTL 代码,就可以
将该GPU IP核综合并下载到FPGA 进行真正的在板调试。只有开发出RTL 代码,
文章设计的GPU 才有应用价值。因此,在完善了 GPU的SystemC 模型后,应该
将该模型细化并开发其RTL 模型



下面摘取主要的有意义的图,特别对于流水线中内部实现给予展示:
如果你对流水线感兴趣,可以参与讨论。












































特别注明:scanline算法的上下取整细节












下面是该文章的全文,版权归作者所有。






Rank: 8Rank: 8

注册时间
2015-3-25
积分
126
发表于 2015-11-2 16:28:04 |显示全部楼层
谢谢分享,不错的内容

使用道具 举报

Rank: 12Rank: 12Rank: 12

注册时间
2015-3-5
积分
598
发表于 2015-11-7 23:46:09 |显示全部楼层
有意思

使用道具 举报

Rank: 8Rank: 8

注册时间
2012-1-4
积分
106
发表于 2015-11-17 05:58:19 |显示全部楼层
Thank you very much !!!

使用道具 举报

Rank: 4

注册时间
2017-3-12
积分
33
发表于 2017-3-15 15:37:48 |显示全部楼层
正在努力学习这方面知识,谢谢i

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-5-30 17:17 , Processed in 0.097696 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部