基于图形处理器的格子Boltzmann方法计算

2009-9-16 作者: 封卫兵 杨晓玲 来源: 万方数据

关键字: 图形硬件 图形处理器(GPU) 图形流水线 Cg 

由于图形处理器(GPU)最近几年迅速发展,基于GPU的计算作为一个新的研究方向已经引起越来越多人的关注.在综述国内外最新文献的基础上,从介绍GPU的高性能开始,分析GPU本身的特性,介绍GPU的计算模型并分析其流水线结构.阐述如何对GPU进行编程.并初步实现基于GPU的格子Boltzmann方法(LBM)计算.

  1999年NVIDIA公司推出了GeForce256图形芯片,它是第一款从硬件上支持多边形变换和光照计算(transformation&lighting,T&L)的显示芯片,也就是说它能够承担部分原来由CPU完成的工作,将CPU从繁重的计算中解放出来.从这款芯片开始,NVIDIA公司开始将图形硬件称为图形处理器(graphics processing unit,GPU).

  到目前为止,GPU已经经过了四代的发展,每一代都拥有比前一代更强的性能和更完美的可编程架构.现在的GPU已经在每个微芯片的晶体管数目上超过了CPU,例如Intel公司在他们的Intel 2.4 GHzPentium 4处理器中封装了5500万个晶体管,而NVIDIA公司在最初的GeForce FX图形处理器中使用了超过1.25亿个晶体管.GPU所具有的高性能从下例可见一斑:2004年,Nvidia GeForce 6800 Ultra可达到峰值40 Gigaflops(1 Gigaflops等于1S进行10亿次的浮点运算),2005年发布的NVIDIA GeForee7800 GTX更是将峰值提高至令人惊讶的169Gigaflops,而Intel 3 GHz Pentium 4采用SSE指令集也只能达到6 Gigaflops(如图1所示).

  自从1998年以来,GPU的性能以每年2.8倍的速度增长,而且估计还可以维持这一增长速度5年左右.GPU的更新换代很迅速,平均每一年多便有新一代的GPU诞生.当人们发现图形处理器能够有效地应用于通用计算时,这首先引起了图形界的极大关注.2003年,世界上唯一的图形学硬件年会(SIGGRAPH/EUROGRAPHICS Graphics Hardware2003)迅速将其重点转向了计算机图形处理器的非图形应用.有专家认为,GPU在2003年已经进入计算的主流’引.此届年会将成为现代计算的一个转折点.2003年被认为是图形硬件被用来做通用计算的一个里程碑.

  1 、GPU的通用计算模型

  1.1 GPU特性分析

  从本质上来讲,GPU是一个向量运算器,它的结构体系都是专门针对向量运算而设计的.采用图形硬件来做通用计算的主要目的是为了加速,GPU的运算速度如此之快,主要得益于GPU是为图形实时渲染量身定制的,具有以下主要特征.

  (1)超长的流水线.GPU采用了几百级的流水线,如GeForee3的流水线有多达800个阶段,而GeForce3的时钟频率是200 MHz(每个时钟周期是5 ns),因此时钟延迟为5×10-9×800=4us.为了让流水线保持忙碌,使用了多线程机制,而且图形渲染本质上是一个并行任务,无论是CPU送给GPU的顶点数据,还是GPU光栅生成器产生的像素数据都是互不相关的,可以并行地独立处理.

  (2)并行计算.这一功能主要是通过多个渲染管道和RGBA 4个颜色通道同时计算来体现的,另外在一个时钟周期内可以同时获取2个甚至更多副纹理.顶点程序的多个渲染管道意味着在一个时钟周期内可以并行处理多个顶点,而对于像素程序同样如此.

  (3)高密集的运算.由于图形卡内部的内存接口位宽大于CPU上的位宽,如GeForce FX的内存位宽达256位,显然高于CPU上32位的位宽,这样整个计算的带宽大大提高.GPU相对于CPU来说,更适应传输大块的数据,虽然CPU上有Cache可以加速整个计算过程,但CPU上的Cache相对于图形卡显存来说太小,一般只有64 kB,而现在的显存大多都在64 MB以上.

  (4)减少了GPU与CPU的数据通信.当整个应用针对图形生成的时候,不再需要在CPU与GPU之间进行多次数据交换,从而可以将CPU解放出来做其他的事情.这些优势使得GPU比CPU更适用于流处理计算,因此GPU也被认为是一个单指令流多数据流(single instruction multiple data,SIMD)的并行机或者流处理器,可以用于处理大规模数据集,使得应用得到加速.

  1.2 GPU计算模型

  图形处理的任务如渲染一个3D场景需要一系列可以并行和按照固定顺序进行的处理阶段,即图形硬件流水线.每个阶段都从它的前一阶段接收输入,然后把输出发给随后的阶段.图2显示了当今图形处理器所使用的图形硬件流水线.

  顶点变换(vertex transformation)是图形硬件流水线中的第一个处理阶段,顶点变换在每个顶点上执行一系列的数学操作,把顶点位置变换到屏幕位置,重新确定顶点的表面属性和光照属性。

  图元装配和光栅化(primitive assembly and rasterization)首先将变换后的顶点根据它们的连接信息重新装配成几何图元(一系列的多边形、线段和点),然后对图元进行剪裁和挑选,最后对剪裁和挑选剩下的多边形进行光栅化,即决定哪些像素被几何图元覆盖.

  片段操作(fragments operations)通过纹理取样和纹理操作计算每个片段的最终颜色值,并确定片段的深度值.

  光栅操作(raster operations)根据一系列测试检查每个片段,这些测试包括剪切、alpha、模板和深度等测试,涉及了片段最后的颜色或深度、像素的位置和一些像素值.

  随着图形处理计算需求的增长,固定流水线的模式已经很难适应图形处理不断增长的计算需求以及虚拟现实等应用的实时需求,可编程的灵活性是势在必行的.以NVIDIA和ATI为代表的GPU的技术和产品则适应了这种需求.

  GPU可编程并行处理能力分布在两部分:顶点处理器(vertex processor)和片断处理器(fragment processor).顶点处理器操作在空间的几何点上,因而比较适用于除图形绘制以外的几何操作类的应用;片断处理器由于是操作在像素一级的单元上,具有较大容量的“纹理”空间,可以模拟纹理数据及其操作,因而可以更广泛地用于各种通用计算.它们都是典型的流处理机(stream processor).这种流处理机与向量处理机的主要区别在于,它不具有大容量的快存/存储器可以读写,只是直接在芯片上利用临时寄存器作流数据的操作.对于GPU而言,图形流数据分别是顶点图元及光栅化后的像素.根据图形处理的特点,GPU流处理的元素为4个单元的向量,正是这种流处理机的并行结构,为通用计算提供了并行计算的平台.

  1.3基于GPU的编程

  GPU所提供的可编程功能以顶点处理器和像素处理器的操作形式完成,使用类似于C的高级语言对GPU直接编程一直是图形界努力追求的目标.近年来具有较大影响的图形绘制语言有:OpenGL shading language、斯坦福大学的RTSL(real—time shading language)、Microsoft的HLSL(high level shading language)以及NVIDIA的Cg.尽管还未形成统一的绘制语言,但这些语言的研究和应用为用户提供了直接基于API(OpenGL或DirectX)编程的较为方便和高层次的工具,尤其是NVIDIA公司的Cg.

  GPU所执行的两个主要操作是顶点操作(vertex operations)和片段操作(fragment operations),Cg与二者对应的就是顶点程序(vertex program)和片段程序(fragment program).顶点程序能在GPU中对模型网格中的每个顶点执行某种计算,而片段程序是在GPU中对模型网格的每个片段执行指定计算.Cg是基于数据流模型的,渲染三维场景时,每当一个顶点被处理或者光栅化产生一个片段,程序员编写的顶点或片段程序就会被执行.顶点程序总是在片段程序之前运行,并且其输出参数可以直接作为片段程序的输入参数.片段程序对每个片段进行操作并输出操作结果,通常表现为片段的颜色值.




责任编辑:熊东旭