GPU编程入门简介

GPU编程入门简介

Programmable Graphics Processing Unit( GPU),即可编程图形处理单元,通常也称之为可编程图形硬件。

GPU 概念在 20 世纪 70 年代末和 80 年代初被提出,使用单片集成电路( monolithic)作为图形芯片,此时的 GPU 已经被用于视频游戏和动画方面,它能够很快地进行几张图片的合成(仅限于此)。在 20 世纪 80 年代末到 90 年代初这段时间内,基于数字信号处理芯片( digital signal processor chip)的 GPU 被研发出来,与前代相比速度更快、功能更强,当然价格是非常的昂贵。在 1991年, S3 Graphics 公司研制出第一个单芯片 2D 加速器,到了 1995 年,主流的 PC图形芯片厂商都在自己的芯片上增加了对 2D 加速器的支持。与此同时,固定功能的视窗加速器( fixed-function Windows accelerators)由于其高昂的价格而慢慢退出 PC 市场。

1998 年 NVIDIA 公司宣布 modern GPU 的研发成功,标志着 GPU 研发的历史性突破成为现实。通常将 20 世纪 70 年代末到 1998 年的这一段时间称之为pre-GPU 时期,而自 1998 年往后的 GPU 称之为 modern GPU。在 pre-GPU 时期,一些图形厂商,如 SGI、 Evans & Sutherland,都研发了各自的 GPU,这些 GPU在现在并没有被淘汰,依然在持续改进和被广泛的使用,当然价格也是非常的高昂。

modern GPU 使用晶体管( transistors)进行计算,在微芯片( microchip)中,GPU 所使用的晶体管已经远远超过 CPU。例如, Intel 在 2.4GHz 的 Pentium IV上使用 5 千 5 百万( 55 million)个晶体管;而 NVIDIA 在 GeForce FX GPU 上使用超过 1 亿 2 千 5 百万( 125 million)个晶体管,在 NVIDDIA 7800 GXT 上的晶14体管达到 3 亿 2 百万( 302 million)个。

回顾 Modern GPU 的发展历史,自 1998 年后可以分为 4 个阶段。 NVIDIA于 1998 年宣布 Modern GPU 研发成功,这标志着第一代 Modern GPU 的诞生,第一代 Modern GPU 包括 NVIDIA TNT2, ATI 的 Rage 和 3Dfx Voodoo3。这些 GPU 可以独立于 CPU 进行像素缓存区的更新, 并可以光栅化三角面片以及进行纹理操作,但是缺乏三维顶点的空间坐标变换能力,这意味着“必须依赖于 GPU执行顶点坐标变换的计算”。这一时期的 GPU 功能非常有限,只能用于纹理组合的数学计算或者像素颜色值的计算。

从 1999 到 2000 年,是第二代 modern GPU 的发展时期。这一时期的 GPU可以进行三维坐标转换和光照计算( 3D Object Transformation and Lighting,T&L),并且 OpenGL 和 DirectX7 都提供了开发接口,支持应用程序使用基于硬件的坐标变换。这是一个非常重要的时期,在此之前只有高级工作站( workstation)的图形硬件才支持快速的顶点变换。同时,这一阶段的 GPU 对于纹理的操作也扩展到了立方体纹理( cube map)。 NVIDIA 的GeForce256GeForce MAX, ATI 的 Radeon 7500 等都是在这一阶段研发的。

2001 年是第三代 modern GPU 的发展时期,这一时期研发的 GPU 提供 vertex programmability(顶点编程能力),如 GeForce 3, GeForce 4Ti, ATI 的 8500 等。这些 GPU 允许应用程序指定一个序列的指令进行顶点操作控制( GPU 编程的本质!),这同样是一个具有开创意义的时期,这一时期确立的 GPU 编程思想一直延续到 2009 年的今天,不但深入到工程领域帮助改善人类日常生活(医疗、地质勘探、游戏、电影等),而且开创或延伸了计算机科学的诸多研究领域 (体绘制、光照模拟、人群动画、通用计算等)。同时, Direct8 和 OpenGL 都本着与时俱进的精神,提供了支持 vertex programmability 的扩展。不过,这一时期的GPU 还不支持像素级的编程能力, 即 fragment programmability (片段编程能力),在第四代 modern GPU 时期,我们将迎来同时支持 vertex programmability 和
fragment programmability 的 GPU。

第四代 modern GPU 的发展时期从 2002 年末到 2003 年。NVIDIA 的 GeForce FX 和 ATI Radeon 9700 同时在市场的舞台上闪亮登场,这两种 GPU 都支持 vertex15 programmability 和 fragment programmability。同时 DirectX 和 OpenGL 也扩展了自身的 API,用以支持 vertex programmability 和 fragment programmability。自 2003年起,可编程图形硬件正式诞生,并且由于 DirectX 和 OpenGL 锲而不舍的追赶潮流, 导致基于图形硬件的编程技术, 简称 GPU 编程, 也宣告诞生。恭喜 GeForce和 ATI 的硬件研发人员,你们终于可以歇口气了,不用较着劲地出显卡了,同时也恭喜 DirectX 和 OpenGL 的研发人员,你们也可以休息下了,不用斗鸡一般的工作了, 最后恭喜广大工作在图形图像领域的程序员, 你们可以继续学而不倦。

目前最新的可编程图形硬件已经具备了如下功能:
1、支持 vertex programmability 和 fragment programmability。
2、支持 IEEE32 位浮点运算。
3、支持 4 元向量, 4 阶矩阵计算。
4、提供分支指令,支持循环控制语句。
5、具有高带宽的内存传输能力( >27.1GB/s)。
6、支持 1D、 2D、 3D 纹理像素查询和使用,且速度极快。
7、支持绘制到纹理功能( Render to Texture, RTT)。
关于 GPU 发展历史的相关数据参考了 Feng Liu 的“Platform IndependentReal-time X3D Shaders and Their Applications in Bioinformatics Visualization”一文。

GPU 具有高并行结构( highly parallel structure),所以 GPU 在处理图形数据和复杂算法方面拥有比 CPU 更高的效率。 
CPU 展示了 GPU 和 CPU 在结构上的差异, CPU 大部分面积为控制器和寄存器,与之相比, GPU 拥有更多的 ALU( Arithmetic Logic Unit,逻辑运算单元)用于数据处理,而非数据高速缓存和流控制,这样的结构适合对密集型数据进行并行处理。 CPU 执行计算任务时,一个时刻只处理一个数据,不存在真正意义上的并行(请回忆 OS 教程上的时间片轮转算法),而 GPU 具有多个处理器核,在一个时刻可以并行处理多个数据。

GPU 采用流式并行计算模式,可对每个数据进行独立的并行计算,所谓“对数据进行独立计算”,即,流内任意元素的计算不依赖于其它同类型数据,例如,计算一个顶点的世界位置坐标,不依赖于其他顶点的位置。而所谓“并行计算”是指“多个数据可以同时被使用,多个数据并行运算的时间和 1 个数据单独执行的时间是一样的”。 

可能有人会问道:既然 GPU 在数据处理速度方面远胜 CPU,为什么不用GPU 完全取代 CPU 呢?实际上,关于GPU 取代 CPU 的论调时有出现,但是作者本人并不同意这种观点,因为 GPU 在许多方面与 CPU 相比尚有不如。首先,虽然 GPU 采用数据并行处理方式极大加快了运算速度,但正是由于“任意一个元素的计算不依赖于其它同类型数据”,导致“需要知道数据之间相关性的”算法,在 GPU 上难以得到实现(但在 CPU 上则可以方便的实现),一个典
型的例子是射线与不规则物体的求交运算。

此外, GPU 在控制流方面弱于 CPU,在图中可以看到, GPU 中的控制器少于 CPU,而控制器的主要功能是取指令,并指出下一条指令在内存中的位置,控制和协调计算机的各个部件有条不紊地工作。 在早期的 OpenGL fp2.0, fp3.0以及 DirectX 的 ps_4_0 之前的 profile 版本都不支持或不完全支持循环控制流语句(目前在软硬件方面都已得到改进)。由于 GPU 编程完全依赖于图形硬件,故而较早版本的 GPU 并不支持一些常用的编程需要,而现在很多个人电脑或者公司的电脑的更新换代并没有那么快(考虑个人电脑的使用寿命在 4-6 年,所以在2012 之后,旧式显卡的更新换代会基本结束),这也制约了 GPU 编程技术的使用。

最后进行 GPU 编程必须掌握计算机图像学相关知识,以及图形处理 API,入门门槛较高,学习周期较长,尤其国内关于 GPU 编程的资料较为匮乏,这些都导致了学习的难度。在早期, GPU 编程只能使用汇编语言,开发难度高、效率低,不过,随着高级 Shader language 的兴起,在 GPU 上编程已经容易多了。

转自:《GPU编程与CG语言之阳春白雪下里巴人》


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值