- 第1页:全文导读与内容简介
- 第2页:前言:通过GPU见证行业变革
- 第3页:第一章:GPU工作原理与并行计算
- 第4页:21世纪视觉需求与GPU变化
- 第5页:从山峰渲染了解GPU图形流水线
- 第6页:CPU与GPU的设计方向决定运算能力
- 第7页:GPU并行编程为何加速发展
- 第8页:GPU并行计算已成未来趋势
- 第9页:初识高性能并行计算
- 第10页:高性能并行计算发展历程
- 第11页:高性能并行计算单元分类
- 第12页:初识基于GPU系统的云计算
- 第13页:第二章:GPU结构与ATI产品发展
- 第14页:统一着色器架构释放GPU运算能力
- 第15页:传统GPU发展与着色器管线
- 第16页:传统SIMD结构流处理器指令细节
- 第17页:MIMD结构流处理器指令细节
- 第18页:R600时代对SIMD架构补充与优化
- 第19页:两种结构流处理器优劣对比
- 第20页:R300以来的芯片架构及其影响
- 第21页:ATI第一代统一渲染架构Xenos
- 第22页:统一渲染GPU R600临危受命
- 第23页:AMD对GPU架构的不断改进和优化
- 第24页:未来ATI图形芯片架构预测
- 第25页:第三章:GPU通用计算发展与细节
- 第26页:多核并行计算困惑与发展
- 第27页:基于AMD CPU+GPU异构计算平台
- 第28页:着色器模型变化历程与总结
- 第29页:Shader计算能力快速发展
- 第30页:揭秘GPU高性能计算关键
- 第31页:CPU与GPU的区别和发展方向
- 第32页:如何将GPU功能单元映射为通用单元
- 第33页:分支对GPU结构体系的挑战
- 第34页:GPU与CPU将如何演绎融合与吞并
- 第35页:第四章:GPU内部计算实现细节
- 第36页:GPU主要计算单元分布和职能
- 第37页:GPU内部通用计算代码运算过程
- 第38页:认识GPU浮点计算精度
- 第39页:整数运算能力与未来融合架构
- 第40页:GPU存储体系特点与变化
- 第41页:ATI GPU吞吐特性对比与分析
- 第42页:ATI GPU OPEN CL综合性能分析
- 第43页:先进混合架构之Larrabee展望
- 第44页:概念型融合架构之Fusion APU展望
- 第45页:GPU进化架构之Fermi分析
- 第46页:第五章:ATI GPU通用计算实例
- 第47页:ATI Stream技术发展与现状
- 第48页:OPEN CL接口技术与异构运算
- 第49页:Havok引擎与CPU+GPU异构运算
- 第50页:BOINC平台充沛的ATI GPU加速项目
- 第51页:最具影响力的Folding@home项目
- 第52页:GPU架构对于其他实例的适应性
- 第53页:全文总结与未来架构展望
全文导读与内容简介
● 全文导读与内容简介
在2010年8月16日,AMD宣布推出全面支持OpenCL 1.1的ATI Stream软件开发包(SDK)2.2版,新版本的SDK为开发人员提供开发强大的新一代应用软件所需要的工具。这一版本的最大意义在于它表明了AMD在不断追求与开放性应用程序接口OpenCL的兼容,同时AMD再通过OpenCL快速提升其在业行内的影响力,毕竟借助这一标准,AMD和NVIDIA站在了统一起跑线上,OpenCL接口对于一个技术与标准的追随者来说是千载难逢的机会。
作为全世界成立较早和目前仍然具备绝对影响力的图形芯片生产厂商,ATI一直在探索图形芯片发展的方向,并在这25年发展历程中长期领跑GPU性能增长。自从统一渲染架构提出以来,ATI一直在寻求对这款架构的完善,我们看到继Xenos之后的在PC市场ATI设计了R600到R800一系列性耗比和性价比广受好评的架构。
全面支持OpenCL 1.1的ATI Stream软件开发包(SDK)2.2版
不同厂商对于未来计算环境的考虑是有很大差异的,NVIDIA正在借助G80架构以来的特性不断加强GPU的通用性和编程易用性,其GPU内部大量单元用于逻辑控制和存储,而AMD则主要倾向于用最少的晶体管开销用于流处理器阵列的构建,用线程规模来掩盖延迟。总体来说,NVIDIA坚持的TLP(线程并行度)考验线程能力和并性能力,AMD坚持的ILP(指令并行度)则考验指令处理。
今天我们希望总结我们之前获得的大量资料,借助这篇文章对AMD并行计算技术做比较详细的特性分析。在文章的不同章节,我们将各有侧重地分析GPU并行计算的原理、发展历程、运算单元细节和目前我们能够找到的GPU通用计算实例。同时我们对Fermi架构、Fusion概念和Larrabee架构的特性做简单分析和预测,希望能让用户通过这些业界最为前瞻的产品找到未来GPU发展路径。
我们将以21世纪视觉需求与GPU变化为开端回忆GPU从诞生以来的应用领域变革,通过GPU渲染流水线全面转向可编程浮点单元,GPU已经走向了并行应用,同时成为超级计算机不可或缺的部件。在目前备受关注的云计算领域,GPU同样可以发挥自己运算密度和并发线程数极高的特色,更多无法采购大型设备而急需计算资源的用户,将享受到GPU云计算带来的便利。
我们将从R300架构开始回顾ATI GPU发展历程,同时和读者一起探讨不同结构流处理器指令细节,同时关注ATI第一代统一渲染架构Xenos对未来发展的影响。
这一章我们参考大量基础性资料来讲解CPU和GPU内部功能单元的异同,通过这些异同和它们的适用环境,我们了解到AMD提出的CPU+GPU异构计算平台能够借助更好的编程接口获得更好的加速比。这种方式比单纯给GPU增加调度能力或者给CPU增加并行度要更为实际,易用性也会得到解决。
这一部分我们关注CPU主要计算单元分布和职能,GPU内部通用计算代码运算过程,同时我们对浮点和整数能力做了进一步分析。这一章的亮点在GPU流处理器结构与性能分析部分,我们使用了较为专业的底层软件来对比不同架构的性能差异,对前文的分析做了数据佐证。
本章我们首先分析了Open CL接口对于ATI GPU未来发展的影响,然后列举了一些普通用户能够找到并且参与计算的分布式并行计算项目。文章最后的蒙特卡洛算法、N-body仿真和基于GPU的计算机病毒特征匹配来自《GPU精粹3》实例分析,我们希望这种具有普遍意义的项目和算法能够拓展未来的GPU应用深度和广度。
濮元恺所写过的技术分析类文章索引(持续更新) | |
7、 显卡只能玩游戏? 10年GPU通用计算回顾 | |
2、改变翻天覆地 最全Fermi架构解读 | |
3、从裸奔到全身武装 CPU功能集成之路探秘 | |
4、AMD统一渲染架构 历程回顾与评测 | |
6、别浪费你的电脑 分布式计算在中国 | 12、Computex独家泄密 解析AMD下代GPU |
前言:通过GPU见证行业变革
● 前言:通过GPU并行计算见证行业最大变革
从1999年到现在从第一个显卡GPU产生到现在只有短短十年的时间。在这短短十年当中我们已经看到了GPU的运算能力呈几何级数提升,这个世界在GPU的虚拟之下更快更真,而更重要的一点是GPU已经将它的应用范围不断拓展。
从图形领域虚拟现实的角度来说,只要有显示终端的地方就需要一颗GPU。借助于GPU可以让医学家观察到更细微的分子;借助于GPU可以让军事演习的拟真度更强;借助于GPU可以让专业工作站的效率翻倍提升;借助于GPU可以让电影的特效骗过你的眼睛。
最近几年中当我们发现GPU的硬件结构能够适应极高并行度与大量浮点吞吐的运算环境,更多的科学研究领域已经开始大量采购GPU设备应用于电脑辅助工程、油气勘探、金融安全评估等领域。至此,GPU存在的意义已远远不是为图形运算服务这么简单。
高性能并行计算已经成为国家竞争力的重要标志之一,对科学技术进步、经济社会发展、生态环境保护和国家与公共安全的作用日益显著。但是,在超级计算机的峰值突飞猛进的同时,其投资大、运行维护成本高、使用效率低等问题也日渐突出,成为制约超算能力提升的瓶颈。
以低廉的成本和现成的网络设施实现高效的GPU超级计算技术越来越受到很多企业及科研单位的关注。GPU运算今天已经在产业界占有一席之地,尤其在科学模型模拟的运算上,都需仰赖GPU执行,动辄比一般中央处理器(CPU)还快出数十倍,甚至数百倍的复杂数学模型运算。
通过Shader单元的可编程性将GPU运用于图形运算之外的应用领域,是本世纪初计算机行业最大的变革,它标志着一种可大规模生产的高性能芯片正在渗透传统CPU掌控的高性能计算领域。借助GPU这种运算单元密集的芯片,各行业可以获取性价比和性耗比更高的运算解决方案。
曾今很多无法想象和耗费巨大的科学命题如全球气候变化、人类基因组工程等等问题如今可以借助GPU的运算能力以更快更经济的途径实现。作为这场变革的见证和参与者,我同样有幸通过媒体的宣传力量,来推动更多人对于GPU参与高性能计算的认识和理解。本文将通过介绍一个在传统图形领域的霸主——AMD GPU产品在通用计算技术方面的发展与技术细节。
第一章:GPU工作原理与并行计算
● 第一章:GPU工作原理与并行计算
10年前我们所有人都认为显卡服务于制图、动画、游戏等电子娱乐领域,这没有错。因为GPU(Graphic Processing Unit 图形处理器)发明的目的就是为了应对繁杂的3D图像处理。GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。但是谁都没有想到10年后的今天,GPU的内部架构和应用范围已经发生了翻天覆地的变化。
随着GPU的可编程性不断增强,可编程浮点单元已经成为GPU内部的主要运算力量,并且调用越来越方便,编程门槛不断降低。GPU的应用能力已经远远超出了图形渲染任务,利用GPU完成通用计算的研究逐渐活跃起来,将GPU用于图形渲染以外领域的计算成为GPGPU(General Purpose computing on graphics processing units,基于GPU的通用计算)。
以前的服务器或者超级计算机都要拆除显卡这个多余的单元以减少发热和功耗,但是GPU通用计算时代的来临将板载GPU的显卡变为超级计算机不可或缺的加速部件。其实首款专门作流处理/并行计算的GPU产品并不是现在炒的火热的NVIDIA的Tesla产品,而是ATI的Fire Stream产品。早在2006年,ATI就发布了基于R580核心的流处理加速卡,48个像素渲染单元成为流处理器的雏形。
R580核心相对于它之前的R520核心最明显的差异就是使用了20%的晶体管增量换来了200%的浮点吞吐量提升,这在当时绝对是一种创举。这种思路的提出是为了适应当时游戏编程环境越来越倚重渲染单元(Pixel Shader)运算,而这种思路的结果除了让ATI在DirectX 9.0时代末期赢得了性能王座之外,还造就了历史上第一款用于图形计算之外的Fire Stream产品。
高性能并行计算发展迅速
上世纪60年代初期,大型主机(Mainframe)的问世标志着并行计算机诞生,随后我们看到计算机体系越来越成熟。高性能计算机甚至体现了一个国家在高科技领域的发言权,其经济发展速度和结构也与高性能计算机的计算能力息息相关。同时随着个人电脑计算能力的增长缓慢和计算需求的提升,云计算似乎成为目前炙手可热的话题。
放眼整个高性能并行计算领域,业界正在为X86架构CPU性能提升缓慢而感到担忧,特别是目前X86架构频率提升不断遇到障碍,并行度受制于传统CISC架构难以获得飞跃。超级计算机只能通过堆砌节点数量还换取性能提升吗?有没有一种性价比性耗比更高的解决方案?也许让每台PC机内置的GPU来处理这些并行数据再合适不过了。
在本章我们将分析GPU工作原理和历史沿革,并告诉读者这种芯片结构为什么能够适应大规模并行计算。同时我们在本章对目前业界所关注的高性能并行计算和云计算也做了简短分析。
21世纪视觉需求与GPU变化
● 21世纪视觉需求与GPU变化
2009年10月30日,我国首套GPU超级计算机“天河一号”由国防科学技术大学研制成功。这套计算机采用了创新的CPU+GPU异构计算设计,不但理论计算性能得到大幅提升,而且达到了很高的能效比。天河一号采用6144个Intel通用多核处理器和5120个AMD图形加速处理器,实测性能排列2009年6月TOP500第四位,峰值性能列第三位。
我国首套GPU超级计算机“天河一号”
在此前的一年,全世界范围内已经出现了越来越多的搭载GPU的超级计算机,而随后的一年中,中国再次使用NVIDIA Tesla产品打造了全世界排名第二的超级计算机系统。之所以GPU频繁登陆大规模并行计算领域,是因为21世纪人类所面临的科研课题已经无法用传统的CPU架构来负责运算。
放下之前讨论的超级计算机回到图形领域,我们会发现21世纪视觉需求同样对硬件发展提出了近乎可不能完成的任务。无论是使用了当时全新游戏引擎的《毁灭战士3》(Doom 3)还是首次使用延迟渲染技术的《彩虹6号:维加斯》,直到DirectX 10时代测试显卡不可缺少的项目《孤岛危机》,都在给游戏玩家带来巨大震撼的同时考验着PC硬件的承受能力。
实际上从1995年id software创作出第一款震惊世界的3D游戏《毁灭战士》开始,个人电脑3D游戏之路开始变得无限宽阔。甚至有一句话一直回荡在所有资深游戏玩家耳边“上帝花了6天创造了这个世界,id software和它的创始人、引擎师约翰•卡马克(John Carmark),则用6款游戏创造了个人电脑的3D世界。”
除了PC游戏应用对GPU发展的牵引力之外,专业渲染领域同样对强大的GPU运算能力充满渴求。我们在2006年看到了使用当时最先进GPU技术来制作的史诗电影《圆明园》,这部电影大规模使用电脑场景仿真动画技术,重现圆明园的瑰丽与辉煌。在国防军工方面,GPU也得到了广泛应用,最先进的战斗机上已经安装了专业GPU用于绘制目标标示和数据显示。大型军事视景仿真系统已经将一款高端的GPU芯片作为标配硬件。
GPU为了能够满足人类“贪婪”的视觉需求,内置了大量的运算单元,它们从负责三角形生成到顶点与像素的处理,特别是着色引擎为了更快更多实现图形渲染而迅速扩张,使得GPU的晶体管集成度以超越CPU摩尔定律3倍的速度发展,同一时期GPU的浮点吞吐速度也达到了CPU的十倍左右。
从山峰渲染了解GPU图形流水线
● 从山峰渲染了解GPU图形流水线
在这一部分,笔者将和大多数初识GPU的爱好者一道探寻GPU的渲染步骤,我们使用一座山峰的渲染历程来帮助大家简单理解GPU图形流水线的工作原理。简单的说:GPU主要完成对3D图形的处理——图形的生成渲染。
从山峰渲染看GPU图形流水线
1、顶点生成
图形学API(应用程序接口)用最初级的图元(点、线、三角形)来表示物体表面。每个顶点除了(x,y,z)三维坐标属性外还有应用程序自定义属性,例如位置、颜色、标准向量等。结合到我们看到的这座山峰,首先GPU从显存中读取描述山峰3D外观的顶点数据。
2、顶点处理
这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(顶点着色器)完成。这个阶段中GPU生成一批反映山峰三角形场景位置与方向的顶点。
3、光栅化计算
显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
在屏幕空间内生成山峰顶点之后,这些顶点被分为三角形图元,GPU内的固定单元会对这些山峰图元做光栅化过程,相应的片元集合也就随之产生。
4、纹理帖图
顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。
5、像素处理
这个阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。
像素操作用每个片元的屏幕坐标来计算该片元对最终生成图像上的像素的影响程度。在这个阶段Pixel Shader(像素着色器)从显存中读取纹理数据对山峰片元上色并渲染。
6、最终输出:
由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。AA即多重采样,对ROP性能和图形卡带宽有相当的压力。而各项异性过滤则对TMU带来更多的负担。
这个阶段由ROP单元完成所有山峰像素到帧缓冲区的输出,帧缓冲区内的数据,经过D/A转换输出到显示器之后,我们就可以看到绘制完成的山峰图像。
CPU与GPU的设计方向决定运算能力
近30年来,由Intel、IBM、SUN、AMD和富士通生产的通用CPU虽然有了很大发展,但性能提高速度却已经不能与上世纪八十年代末九十年代初相比。单线程处理性能在很大程度上受到了限制。这些限制一方面来自于通用计算程序中过低的指令级并行;另一方面来自于“功率墙(Power Wall)”——集成电路的功率消耗的物理限制。
而GPU的用途已经远远超出运行游戏,我们买到的显卡其实是一块高性能加速器。特别是现在NVIDIA和AMD的显卡产品都体现出了极高的浮点运算能力,双精度浮点运算中的衰减也越来越小。
举例说,在Folding@home项目中,一款中端显卡一天24小时可以计算10个左右的大分子蛋白质折叠,而一款酷睿2双核E7200处理器的一个核心在24小时内完成一个小分子包运算任务都非常困难。CPU和GPU在高密度多线程浮点运算中体现出的性耗比差异,相信大家已经非常清楚。在这一节,我们将着重分析GPU相对于CPU的架构优势。
CPU和GPU架构差异很大,CPU功能模块很多,能适应复杂运算环境;GPU构成则相对简单,目前流处理器和显存控制器占据了绝大部分晶体管。CPU中大部分晶体管主要用于构建控制电路(比如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。
CPU和GPU逻辑架构对比
而GPU的控制相对简单,而且对Cache的需求小,所以大部分晶体管可以组成各类专用电路、多条流水线,使得GPU的计算速度有了突破性的飞跃,拥有了惊人的处理浮点运算的能力。现在CPU的技术进步正在慢于摩尔定律,而GPU(视频卡上的图形处理器)的运行速度已超过摩尔定律,每6个月其性能加倍。
CPU的架构是有利于X86指令集的串行架构,CPU从设计思路上适合尽可能快的完成一个任务;对于GPU来说,它的任务是在屏幕上合成显示数百万个像素的图像——也就是同时拥有几百万个任务需要并行处理,因此GPU被设计成可并行处理很多任务,而不是像CPU那样完成单任务。
CPU内部架构
当今CPU仅前端部分就非常复杂,指令解码、分支预测等部分消耗晶体管数量巨大。CPU的设计目标是不仅要有很高的吞吐量,还要有良好的应用环境兼容性,CPU所要面对的应用面远远超过了GPU。CPU是设计用来处理通用任务的处理、加工、运算以及系统核心控制等等的。CPU中包含的最基本部件有算术逻辑单元和控制单元,CPU微架构是为高效率处理数据相关性不大的计算类、复杂繁琐的非计算类的等工作而优化的,目的是在处理日常繁复的任务中应付自如。
GPU设计的宗旨是实现图形加速,现在最主要的是实现3D图形加速,因此它的设计基本上是为3D图形加速的相关运算来优化的,如z-buffering消隐,纹理映射(texture mapping),图形的坐标位置变换与光照计算(transforming & lighting)等等。这类计算的对象都是针对大量平行数据的,运算的数据量大。但是GPU面对的数据类型比较单一,单精度浮点占到其处理数据的绝大多数,直到GTX200和HD 4800系列显卡才对双精度运算提供了支持。
GPU并行编程为何加速发展
● GPU并行编程为何加速发展
回到我们刚开始讨论的地球科学、医学研究与金融建模那些计算问题,可能有很多读者会问到“为什么要花这么大力气将传统CPU上运行的程序移植到GPU环境中运行?”答案其实很简单——追求更高的性价比和性耗比。
GPU能够明显加速算术密集型并行计算任务
虽然GPU并不适用于所有问题的求解,但是我们发现那些对运算力量耗费巨大的科学命题都具备天然的“算术密集型”特色。这类程序在运行时拥有极高的运算密度、并发线程数量和频繁地存储器访问,无论是在音频处理、视觉仿真还是到分子动力学模拟和金融风险评估领域都有大量涉及。这种问题如果能够顺利迁移到GPU为主的运算环境中,将为我们带来更高效的解决方案。
在1996年,美国Sandia国家实验室研发了超级计算机“ASCI Red”,浮点运算性能首次突破1TFlops,但它需要非常多的节点和耗电。它是一套基于mesh网状结构(38 X 32 X 2)的MIMD大规模并行机(MIMD massively parallel machine),起初包含7264个计算节点、1212GB分布式内存和12.5TB磁盘存储容量。
该机器的原型使用的是英特尔的Pentium Pro处理器,每个处理器的时钟频率达到200MHz,后来才升级到Pentium II OverDrive处理器。升级后的系统拥有9632个处理器,每个处理器的主频为333MHz。ASCI Red超级计算机由104个机柜组成,占地面积达到了230平方米。
廉价的1TFLOPS解决方案——Radeon HD4000系列产品
时间一晃而过到2008年,ATI发布了统一渲染架构下的第二代PC领域GPU产品——Radeon HD4000系列产品,其中定位在中高端市场的Radeon HD4850显卡在当时使用了800个频率达到625MHz的流处理器,仅用110W的耗电带来了1TFlops的运算能力。这时人类获取1TFlops的经济支出仅为199美元。
一款HD5870相当于177台深蓝超级计算机节点
仅仅一年之后,ATI再次发力优化统一渲染架构,发布了Radeon HD5000系列产品,其中高端产品HD5870已经集成了2.7 TFlops运算能力。这颗GPU的问世标志着ATI已经成熟掌握了40nm制程工作、DirectX 11应用程序接口和吞吐带宽极高的DDR5显存。同时这颗GPU的运算能力相当于177台深蓝超级计算机节点。
传统意义上的GPU不善于运行分支代码,但是ATI和NVIDIA经过长期改进其内部架构已经使得GPU可以较为高效地运行分支、循环等复杂代码。同时因为GPU属于并行机范畴,相同的运算可以应用到每个数据元素的时候,它们可以达到最好的性能。在CPU编程环境中,写出每个输入数据元素有不同数量的输入的程序很容易,但在GPU这种并行机上还是有不少麻烦。
通用的数据结构正是GPU编程的最大困难之一。CPU程序员经常使用的数据结构如列表和树在GPU身上并不容易实现。GPU目前还不允许任意存储器访问,而且GPU运算单元的设计为主要操作是在表现位置和颜色的四维向量上。
不过这些并不能阻挡GPU编程的加速发展,因为GPU不是真的为通用计算而设计的,需要一些努力才能让GPU高速地服务通用计算程序。这些努力前些年是程序员而单独实现的,而随着ATI和NVIDIA开始看到高性能计算市场的硬件需求,我们看到无论是Fermi架构添加全能二级缓存和统一定址还是RV870架构不断优化LDS并放大并发线程数,这些都是GPU自身硬件体系为了适应未来的运算环境而做出的变革。
GPU并行计算已成未来趋势
● GPU并行计算已成未来趋势
无数游戏玩家疯狂的购买力已经使得GPU这种芯片的价格下跌到只要花一百美元就能买到一颗性能级GPU产品,那为什么不大面积部署这种产品,来降低超级计算机的价格呢?从2006年的第一款Fire Stream产品开始,业内人士已经发现了GPU在处理大并行度程序时所表现出的超常性能。
在传统的GPU种,Shader单元从出现(2001年DirectX 8发布标志着Shader单元出现)到运算能力迅速提升(2007年Geforce 8800GTX发布,通用计算影响力显著扩大)经过了很长时间。在这段时间里,显卡对于高端大规模并行运算是毫无价值的,即使有少量业界先行者开始了思考和研究,也无法形成对整个产业的影响力。
GPU开始应用于超级计算机
这个阶段在超级计算机与集群中,往往要拆除“多余的”显卡以节能功耗,而自从AMD公司的Stream架构NVIDIA公司的CUDA架构奠定了GPU通用计算地位之后,现在的设计开始逐渐采用大量GPU来获得更加廉价和绿色的计算能力。CUDA的强大性能引发了一场通用计算革命,这场革命将极大地改变计算机的面貌。
但是随着GPU的可编程性不断增强,GPU的应用能力已经远远超出了图形渲染任务,利用GPU完成通用计算的研究逐渐活跃起来,将GPU用于图形渲染以外领域的计算成为GPGPU(General Purpose computing on graphics processing units,基于GPU的通用计算)。
而与此同时CPU则遇到了一些障碍,CPU为了追求通用性,将其中大部分晶体管主要用于构建控制电路(比如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。在CPU上增加并行度已经变得越来越困难,虽然HTT超线程技术在Intel的推广下得以应用在自家的高端CPU中,但是目前单颗CPU所拥有的最大线程数还只是12个。
我们已经习惯了计算机核心性能的不断提升,而且似乎认为这是理所当然的事。因为传统芯片的性能提升可以依赖芯片制造工艺的进步。这种进步我们通常用摩尔定律来概括。1965年Intel的创始人戈登•摩尔(Gordon Moore)通过长期的对比研究后发现:CPU中的部件(我们现在所说的晶体管)在不断增加,其价格也在不断下降。“随着单位成本的降低以及单个集成电路集成的晶体管数量的增加;到1975年,从经济学来分析,单个集成电路应该集成65000个晶体管。”Intel此后几年的发展都被摩尔提前算在了纸上,使人们大为惊奇,“摩尔定律”也名声大振。为了让人们更直观地了解摩尔定律,摩尔及其同事总结出一句极为精练的公式 “集成电路所包含的晶体管每18个月就会翻一番”。
将摩尔定律简单应用在芯片集成度的增长方面,我们可以得出这在今天意味着:每年单芯片中可以大约多放置50%的元件。这种技术表面上为我们的芯片发展铺平了道路,虽然大多数趋势是向好的。比如说20年前芯片设计者刚刚开始把浮点运算单元FPU集成到CPU核心,但是20年后这个单元制占用1平方毫米不到的空间,而且同一个核心上可以放置上百个浮点运算单元。
但是这种性能提升并不是无止境的,而且这些技术发展最重要的后果是它们之间的区别。当某一指标变动速度和其他指标变动速率不同时,我们就需要重新考虑在芯片和系统设计背后的假设。换而言之目前CPU已经遇到了非常严重的计算与通信障碍、存储器延迟与带宽障碍和发热与功耗。而GPU在这3个方面表现显然要比CPU更为出色,在后文我们将详细分析GPU在这诸多方面的特性。
初识高性能并行计算
● 初识高性能并行计算
并行计算是指同时对多个任务或多条指令、或对多个数据项进行处理。完成此项处理的计算机系统称为并行计算机系统,它是将多个处理器(可以几个、几十个、几千个、几万个等)通过网络连接以一定的方式有序地组织起来(一定的连接方式涉及网络的互联拓扑、通信协议等,而有序的组织则涉及操作系统、中间件软件等)。
简单认识并行计算编程
并行计算的主要目的:一是为了提供比传统计算机快的计算速度;二是解决传统计算机无法解决的问题。同时科学与工程计算对并行计算的需求是十分广泛的,但所有的应用可概括为三个方面:
1、计算密集型(Compute-Intensive)
这一类型的应用问题主要集中在大型科学工程计算与数值模拟(气象预报、地球物理勘探等)。
2、数据密集型 (Data-Intensive)
Internet的发展,为我们提供了大量的数据资源,但有效地利用这些资源,需要进行大量地处理,且对计算机的要求也相当高,这些应用包括数字图书馆、数据仓库、数据挖掘、计算可视化。
3、网络密集型 (Network-Intensive)
通过网络进行远距离信息交互,来完成用传统方法不同的一些应用问题。如协同工作、遥控与远程医疗诊断等。
GPU所擅长应对的并行计算问题,正是我们之前提到的计算密集型(Compute-Intensive)问题。因为GPU内部大量充斥着ALU运算单元阵列,这种单元应对并行度高运算密度大的问题比CPU获取的加速比要高很多倍。
通过上图我们可以较为容易地理解串行运算和并行运算之间的关系。传统的串行编写软件具备以下几个特点:要运行在一个单一的具有单一中央处理器(CPU)的计算机上;一个问题分解成一系列离散的指令;指令必须一个接着一个执行;只有一条指令可以在任何时刻执行。
而并行计算则改进了很多重要细节:要使用多个处理器运行;一个问题可以分解成可同时解决的离散指令;每个部分进一步细分为一系列指示;每个部分的问题可以同时在不同处理器上执行。
高性能并行计算发展历程
● 高性能并行计算发展历程
计算机的起源可以追溯到欧洲文艺复兴时期。16-17 世纪的思想解放和社会大变革,大大促进了自然科学技术的发展,其中制造一台能帮助人进行计算的机器,就是最耀眼的思想火花之一。
1614年,苏格兰人John Napier 发表了关于可以计算四则运算和方根运算的精巧装置的论文。1642年,法国数学家Pascal 发明能进行八位计算的计算尺。1848 年,英国数学家George Boole创立二进制代数学。1880 年美国普查人工用了7年的时间进行统计,而1890年,Herman Hollerith用穿孔卡片存储数据,并设计了机器,仅仅用了6个周就得出了准确的数据(62,622,250人)。1896 年,Herman Hollerith 创办了IBM公司的前身。这些" 计算机",都是基于机械运行方式,还没有计算机的灵魂:逻辑运算。而在这之后,随着电子技术的飞速发展,计算机开始了质的转变。
1949年,科学杂志大胆预测“未来的计算机不会超过1.5 吨。”真空管时代的计算机尽管已经步入了现代计算机的范畴,但其体积之大、能耗之高、故障之多、价格之贵大大制约了它的普及应用。直到1947 年,Bell实验室的William B. Shockley、John Bardeen和Walter H. Brattain. 发明了晶体管,电子计算机才找到了腾飞的起点,开辟了电子时代新纪元。
40年代开始的现代计算机发展历程可以分为两个明显的发展时代:串行计算时代、并行计算时代。
并行计算机是由一组处理单元组成的,这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。因此,并行计算机的两个最主要的组成部分是计算节点和节点间的通信与协作机制。并行计算机体系结构的发展也主要体现在计算节点性能的提高以及节点间通信技术的改进两方面。
IBM360大型主机(Mainframe)
60年代初期,由于晶体管以及磁芯存储器的出现,处理单元变得越来越小,存储器也更加小巧和廉价。这些技术发展的结果导致了并行计算机的出现,这一时期的并行计算机多是规模不大的共享存储多处理器系统,即所谓大型主机(Mainframe)。IBM360是这一时期的典型代表。
1976年CRAY-1 问世以后,向量计算机从此牢牢地控制着整个高性能计算机市场15 年。CRAY-1 对所使用的逻辑电路进行了精心的设计,采用了我们如今称为RISC 的精简指令集,还引入了向量寄存器,以完成向量运算。
80年代末到90年代初,共享存储器方式的大规模并行计算机又获得了新的发展。IBM将大量早期RISC微处理器通过蝶形互连网络连结起来。人们开始考虑如何才能在实现共享存储器缓存一致的同时,使系统具有一定的可扩展性(Scalability)。90年代初期,斯坦福大学提出了DASH 计划,它通过维护一个保存有每一缓存块位置信息的目录结构来实现分布式共享存储器的缓存一致性。后来,IEEE 在此基础上提出了缓存一致性协议的标准。
一个基于NUMA架构的SMP服务器
90年代以来,主要的几种体系结构开始走向融合。属于数据并行类型的CM-5除大量采用商品化的微处理器以外,也允许用户层的程序传递一些简单的消息;CRAY T3D是一台NUMA结构的共享存储型并行计算机,但是它也提供了全局同步机制、消息队列机制,并采取了一些减少消息传递延迟的技术。
今天,越来越多的并行计算机系统采用商品化的微处理器加上商品化的互连网络构造,这种分布存储的并行计算机系统称为机群。国内几乎所有的高性能计算机厂商都生产这种具有极高性能价格比的高性能计算机,并行计算机就进入了一个新的时代,并行计算的应用达到了前所未有的广度和深度。
高性能并行计算单元分类
● 高性能并行计算单元分类
受到工艺、材料导致的功耗和发热等物理限制,处理器的频率不会在短时间内有飞跃式的提高,因此采用各种并行方式来提高运算能力已经成为业界共识。在现代的CPU中我们看到设计者广泛使用了超标量、超流水线、超长指令字,SIMD、超线程、分支预测等手段挖掘程序内的指令集并行,并且主流的CPU也有多个处理核心。而GPU与生俱来就是一种“众核”并行处理器,在处理单元的数量上还要远远超过CPU。
实际上我们之前所讲到的并行是一个非常笼统的概念,并行根据层次不同可以分为几种方式,我们可以将各个层级的并行在这里简单分析:
最为微观的是单核指令级并行(ILP),它可以让单个处理器的执行单元同时处理多条指令:向上一个层级是多核并行,它的实现方式是在一个芯片上放置多个物理核心,实现线程级别并行(TLP);再向上则是多处理器并行(Mutil-Processor),它的实现方法是在一块主板上安装多个处理器,以实现线程和进程级别并行;最后可以借助网络实现大规模集群或分布式并行(Cluster and Distributed Parallel),这种环境中每个节点就是一台计算机,可以实现更大规模的并行计算。
Flynn(1966年)分类法是根据系统的指令流和数据流对计算机系统进行分类的一种方法。Flynn分类法通过鉴定数据流和指令流来区分不同类型的计算机系统。其中以下几种就是Flyuu分类法得出的计算机结构:
SISD单指令流单数据流 (Single Instruction stream Single Data stream)
SIMD单指令流多数据流 (Single Instruction stream Multiple Data stream)
MISD 多指令流单数据流(Multiple Instruction stream Single Data stream)
MIMD多指令流多数据流 (Multiple Instruction stream Multiple Data stream)
Flyuu分类法得出的计算机结构
SISD:传统的单处理机系统。由程序生成的一个单指令流,在任意时刻处理单独的数据项。
SIMD:如:阵列处理机系统(Processor Arrays)。由一个控制器负责从存储器中取出指令并将这些指令发送给各个处理器,每个处理器同步执行相同的指令,但操作不同的数据。
MISD:相当于在指令一级并行,而在被操作的数据级串行的情况,实际上这种模型是不能实现的。
MIMD:当今绝大多数并行计算机都属于这一类。每个处理器拥有一个单独的程序,每个程序为每一个处理器生成一个指令流,每条指令对不同的数据进行操作。
Flynn分类法实际上并不能对所有计算机进行分类,如流水线向量处理机就难于按Flynn分类法简单地归为上述四类之一。并行计算机系统除少量专用的SIMD系统外,绝大部分为MIMD系统。
初识基于GPU系统的云计算
● 初识基于GPU系统的云计算
近年来“云计算”这个名词的出现频率越来越高,就连我们日常应用中再也普通不过的输入法居然也有云计算版本,不由得让人感慨,互联网发展速度实在太快,云计算已经开始走进千家万户了。
云计算概念最初是由Google提出的,这是一个美丽的网络应用模式。狭义云计算是指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的资源;广义云计算是指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的服务。
我们可以将云计算(Cloud computing)看作是一种新兴的共享基础架构的方法,可以将巨大的系统池连接在一起以提供各种IT服务。很多因素推动了对这类环境的需求,其中包括连接设备、实时数据流、SOA的采用以及搜索、开放协作、社会网络和移动商务等这样的Web2.0应用的急剧增长。
我们可以接触到的云计算服务
当我们的系统资源不够时,我们可以通过云计算服务商提供的云计算能力来储存数据;当我们没有安装Office类办公软件的时候,我们可以通过Google提供的网络文档编辑文字和图表;当我们遇到自己的电脑无法解决的计算难题时,我们也可以通过云计算的方式让强大的超级计算机或者计算机集群来解决你的问题。
那什么是基于GPU的云计算呢?这个定义其实很简单,此前的种种云计算,都是通过网络传输CPU的运算能力,为客户端返回计算结果或者文件;而GPU云计算则偏重于图形渲染运算或大规模并行计算,为客户端传送逼真的2D图形或3D图像。
当客户端(网络终端)发出请求后,服务器按照要求渲染出高品质的图像发送回来、或者将3D动作以在线流媒体的形式传输回来。对于客户端来说虽然不是实时渲染,但只要网速足够,那就能保证最终的显示效果。
基于ATI Stream硬件的云计算环境
3D云计算最大的好处就是对客户端系统配置的要求大大降低,图形性能很差的老电脑或上网本都可以使用,带有Wifi或3G网络的手机可以随时随地的进行各种3D应用甚至玩游戏,这在以往是不敢想象的。
通过上图我们可以看到,用户的计算机上也许没有强大的CPU和强大的GPU,所以在运行一些大型程序时受到诸多限制。而通过基于ATI Stream硬件的云计算,用户可以将这些计算任务交由远程的ATI Stream硬件集群完成,自身硬件性能的限制可以通过云计算来打破。
和传统的纯粹依靠CPU来进行图像动画渲染计算的服务器相比,Tesla RS GPU系统性能可以高出几十倍,因此能够实时渲染好照片和动画,并把结果传送到终端,而这正是云服务或互联网服务的基本要求,而以往你可能要等上几个小时甚至几天的时间。基于GPU的3D云计算则依靠集群服务器实现实时光线追踪渲染,让普通用户也能感受到顶尖图形技术的魅力。
基于GPU的云计算的应用领域相当广,不同的应用方式对于服务器的要求也不尽相同,简单而言客户端用户数量越多,需要更多的GPU运算资源。封闭的企业级应用反而要求不是很高,针对公众开放式的在线商店或者产品演示、网络游戏等要求最高,当然也将会产生巨大的经济效益。随着云计算的普及,越来越多的中小企业将会受益于这种计算模式,这些企业或工作室不用购买费用高昂的硬件来维持运行,只需租用或免费使用云计算资源,即可享受到远程云端提供的庞大运算能力。
第二章:GPU结构与ATI产品发展
3D计算机图形基本图元是投射空间中的3D顶点,表示为一个四元组(x,y,z,w)的向量,四维的颜色存储为四元组(red,green,blue,alpha)的向量(通常缩写为R,G,B,A),其中Alpha一般表示透明的百分比。统的GPU基于SIMD的架构。
SIMD即Single Instruction Multiple Data,单指令多数据。这种架构天生是为了应对顶点与像素四元组数据而设计的。随后像素着色器还是延续SIMD结构,而顶点单元设计成MIMD组织形式,这是因为顶点单元的操作相对简单,以VS为基础试做MIMD的结构,不论操控还是吞吐都会比较好调整,而且能够得出很好的实验数据。这种分歧,奠定了AMD和NVIDIA两家公司未来的GPU架构主要区别。
作为全世界成立较早和目前仍然具备绝对影响力的图形芯片生产厂商,ATI一直在探索图形芯片发展的方向,并在这25年发展历程中长期领跑GPU性能增长。ATI在1985年使用ASIC技术开发出了第一款图形芯片和图形卡,并在1996年发布了业内第一款3D图形芯片。2000年4月ATI发布了Radeon图形芯片,这是当时世界上最强的图形处理器,Radeon标志着ATI进入高端游戏和3D工作站市场。
2002年ATI发布了让竞争对手无法想象的Radeon 9700芯片,这是R300架构的高端旗舰,也是当时所有高端玩家和专业图形工作站梦寐以求的GPU产品。2003年ATI为微软推出的游戏主机XBOX开发业界尖端的图形单元Xenos,并影响了此后几年间的图形编程环境。这款芯片另一层意义在于它打开了ATI统一渲染架构道路,也为后来几年的产品发展变化打下了坚实基础。
2006年夏季,ATI与AMD做了一次“门当户对”的联姻,此后ATI品牌仍然存在并继续和NVIDIA在图形芯片市场上抗衡。2009年9月AMD发布了业内首款基于DirectX 11的Radeon HD5870显卡,同时将ATI Radeon品牌再次带上性能顶峰。这颗代号RV870的芯片还有一个重大的意义在于它将ATI统一渲染架构做到了最难以掌握的平衡。
合并后的AMD和ATI能够带来新的契机
自从统一渲染架构提出以来,ATI一直在寻求对这款架构的完善,我们看到继Xenos之后的在PC市场ATI设计了Radeon HD2900XT,它能够支持DirectX10标准,拥有当时规模最大的流处理器阵列和显存控制器。Radeon HD3870则代表了工艺和架构的完美妥协,它为用户提供了性价比较高的选择。
随后发布的Radeon HD4870大幅度改进了芯片架构,面向通用计算增加了LDS单元,设计了更为复杂的存储体系,中高端单芯片突破1TFLOPS是它的典型特征,这一浮点吞吐量背后的支撑是它相对于上一代产品2.5倍的流处理器ALU数量提升。直到我们现在使用的ATI高端产品Radeon HD5870则将ATI统一渲染架构浮点吞吐推向极致,在优化存储体系和运算单元的同时,获得了业内公认的更高性耗比。
未来ATI图形芯片架构将会呈现出如何的发展趋势?SIMD结构流处理器的优势是否值得继续保留?或许ATI在嫁给AMD之后做出的抉择远比我们想象的要复杂很多,这种抉择已经不是为了产品更适应市场,而是为了AMD今后对自身的定位和发展方向。
在这一部分我们将从Xenos芯片的设计思路来展开我们对统一渲染架构的探寻和预测。当然不要忘记AMD未来还有一款神奇的产品即将出现在我们的视野,那就是Fusion融合架构相关产品,我们相信最快速度的融合能够提升产品的效能和竞争力,而更深层次的融合将带来更大的想象空间。
统一着色器架构释放GPU运算能力
● 统一着色器架构再次释放GPU运算能力
Shader Model 在诞生之初就为我们提供了Pixel Shader(顶点着色器)和Vertex Shader(像素着色器)两种具体的硬件逻辑,它们是互相分置彼此不干涉的。但是在长期的发展过程中,NVIDIA和ATI的工程师都认为,要达到最佳的性能和电力使用效率,还是必须使用统一着色器架构,否则在很多情况下Pixel Shader计算压力很轻造成大量Pixel Shader单元闲置,Vertex Shader资源有限但遇到大量三角形时会忙不过来。也就是说不再区分Pixel Shader和Vertex Shader,最终设计出来的产品可以在任何API编程模型中都不存在任何顶点/像素着色器固定比率或者数量限制。
Vertex Shader和Pixel Shader负载对比
每一帧渲染中Vertex Shader和Pixel Shader负载压力几乎没有相关性,总是在出现资源闲置和资源紧缺,所以有必要使用统一着色器架构。
在统一着色器架构的GPU中,Vertex Shader和Pixel Shader概念都将废除同时代之以ALU。ALU是个完整的图形处理体系,它既能够执行对顶点操作的指令(代替VS),又能够执行对象素操作的指令(代替PS)。GPU内部的ALU单元甚至能够根据需要随意切换调用,从而极大的提升游戏的表现。
微软XBOX 360所采用的Xenos图形处理器,第一次引入了统一着色器架构,这个着色器架构包含了3个独立的着色器矩阵,每个着色器矩阵内有16个5D向量SIMD单元,这些SIMD单元既可以执行Vertex Shader也可以执行Pixel Shader,可以称之为符合DirectX9标准的统一着色器架构。随后NVIDIA推出的GeForce 8800 GTX使用了128个标量流处理器(Stream Processor)。在通用计算方面,GeForce 8800 GTX的统一架构比Xbox 360的C1更先进、更强大,这表现在标量设计、整个US和Shader簇内的MIMD化执行。
AMD历代着色器演进
在GeForce 8800 GTX之后,AMD经过数月的延迟后推出了代号R600的RADEON HD 2900XT核心,这款产品和NVIDIA的新品一样使用了统一渲染架构,不同之处在于2900XT的64个SIMD着色器内包含了5路超标量(superscalar)的运算单元(ALU),我们习惯性称其拥有320个流处理器。组织形式方面,SIMD单元采用超标量+VLIW(甚长指令)设计,虽然从数量上看规模庞大(共拥有320个ALU,8800 GTX为128个),但是执行效率在实际运算特别是通用计算中会发生不可忽视地衰减。
为方便讨论,在后文分析中,我们将更多地把着色器Shader称为流处理器Stream Processor。
传统GPU发展与着色器管线
● 传统GPU发展与着色器管线
根据第一章的讲解,我们了解到渲染一个复杂的三维场景,需要在一秒内处理几千万个三角形顶点和光栅化几十亿的像素。早期的3D游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成。图形渲染适合并行处理,擅长于执行串行工作的CPU实际上难以胜任这项任务。所以那时在PC上实时生成的三维图像都很粗糙。
1995年设计完成的3dfx Voodoo用自己的深度缓冲区(z-buffer)和纹理映射(texture mapping)技术将3D渲染速度提升到当时的顶峰。1999年发布GeForce 256图形处理芯片时首先提出GPU的概念,Geforce 256所采用的核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术可以说是GPU的标志。
传统的GPU渲染流水线
从DirectX 9开始,ATI抢先发布了代号R300的Radeon 9700,这款GPU产品以简洁明快的设计风格赢得了用户的一致好评,首款DX9图形芯片,256Bit的显存位宽,9700凭借8条管线理所当然的坐上了3D之王的宝座。正是在由微软DirectX 9开启的R300时代,图形芯片厂商意识到了渲染管线的重要性。无论是顶点处理器数量还是像素渲染管线数量都成为各家厂商竞争的重点标准。如果说DirectX 8中的Shader单元还是个简单尝试的话,DirectX 9中的Shader则成为了标准配置。除了版本升级到2.0外,DirectX 9中PS单元的渲染精度已达到浮点精度,游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。
在图形处理中,最常见的像素都是由RGB(红绿蓝)三种颜色构成的,加上它们共有的信息说明(Alpha),总共是4个通道。而顶点数据一般是由XYZW四个坐标构成,这样也是4个通道。在3D图形进行渲染时,其实就是改变RGBA四个通道或者XYZW四个坐标的数值。为了一次性处理1个完整的像素渲染或几何转换,GPU的像素着色单元和顶点着色单元从一开始就被设计成为同时具备4次运算能力的算数逻辑运算器(ALU)。
顶点着色单元(Vertex Shader,VS)和像素着色单元(Pixel Shader,PS)两种着色器的架构既有相同之处,又有一些不同。两者处理的都是四元组数据(顶点着色器处理用于表示坐标的w、x、y、z,但像素着色器处理用于表示颜色的a、r、g、b),顶点渲染需要比较高的计算精度;而像素渲染则可以使用较低的精度,从而可以增加在单位面积上的计算单元数量。在Shader Model 4.0之前,两种着色器的精度都在不断提高,但同期顶点着色器的精度要高于像素着色器。
数据的基本单元是Scalar(标量),就是指一个单独的值,GPU的ALU进行一次这种变量操作,被称作1D标量。由于传统GPU的ALU在一个时钟周期可以同时执行4次这样的并行运算,所以ALU的操作被称作4D Vector(矢量)操作。一个矢量就是N个标量,一般来说绝大多数图形指令中N=4。所以,GPU的ALU指令发射端只有一个,但却可以同时运算4个通道的数据,这就是SIMD(Single Instruction Multiple Data,单指令多数据流)架构。
传统意义上像素渲染流水线(Pixel Shader Pipeline)应该是像素着色器(Pixel Shader Processor,简称PSP):纹理处理单元(Texture Model Unit,简称TMU):像素输出处理单元(Render Back End,简称RBE)=1:1:1。这个比例在DirectX 9.0c末期的Radeon 1900系列中被打破,因为ATI的工程师们认为在未来游戏中显卡Pixel Shader部分的ALU算术指令所占的比例将越来越大,TMU纹理贴图指令所占的比例将缩小。所谓3:1架构就是指Arithmetic:Texture=3:1或是ALU:TMU=3:1。(Arithmetic指算术运算,由ALU完成;Texture也可以指纹理运算,由TMU完成)。
无论是CPU送给GPU的顶点数据,还是GPU光栅生成器产生的像素数据都是互不相关的,可以并行地独立处理。而且顶点数据(xyzw),像素数据(RGBA)一般都用四元数表示,适合于并行计算。在GPU中专门设置了SIMD指令来处理向量,一次可同时处理四路数据,SIMD指令使用起来非常简洁。此外,纹理片要么只能读取,要么只能写入,不允许可读可写,从而解决了存贮器访问的读写冲突。GPU这种对内存使用的约束也进一步保证了并行处理的顺利完成。
传统SIMD结构流处理器指令细节
● 传统SIMD结构流处理器指令细节
传统的GPU基于SIMD的架构。SIMD即Single Instruction Multiple Data,单指令多数据。这种架构天生是为了应对顶点与像素四元组数据而设计的。
传统的VS和PS中的ALU(算术逻辑单元,通常每个VS或PS中都会有一个ALU,但这不是一定的,例如G70和R5XX有两个)都能够在一个周期内(即同时)完成对矢量4个通道的运算。比如执行一条4D指令,PS或VS中的ALU对指令对应定点和像素的4个属性数据都进行了相应的计算。这便是SIMD的由来。
R520架构顶点与像素着色器单元
这种ALU我们暂且称它为4D ALU。需要注意的是,4D SIMD架构虽然很适合处理4D指令,但遇到1D指令的时候效率便会降为原来的1/4。此时ALU 3/4的资源都被闲置。为了提高PS VS执行1D 2D 3D指令时的资源利用率,DirectX9时代的GPU通常采用1D+3D或2D+2D ALU。这便是Co-issue技术。这种ALU对4D指令的计算时仍然效能与传统的ALU相同,但当遇到1D 2D 3D指令时效率则会高不少,例如如下指令:
ADD R0.xyz , R0,R1
//此指令是将R0,R1矢量的x,y,z值相加 结果赋值给R0
ADD R3.x , R2,R3
//此指令是将R2 R3矢量的w值相加 结果赋值给R3
对于传统的4D ALU,显然需要两个周期才能完成,第一个周期ALU利用率75% ,第二个周期利用率25%。而对于1D+3D的ALU,这两条指令可以融合为一条4D指令,因而只需要一个周期便可以完成,ALU利用率100%。但当然,即使采用co-issue,ALU利用率也不可能总达到100%,这涉及到指令并行的相关性等问题,而且,更直观的,上述两条指令显然不能被2D+2D ALU一周期完成,而且同样,两条2D指令也不能被1D+3D ALU一周期完成。传统GPU在对非4D指令的处理显然不是很灵活。
传统的GPU中顶点和像素处理分别由VS和PS来完成,每个VS PS单元中通常有一个4D ALU,可以在一个周期完成4D矢量操作,但这种ALU对1D 2D 3D操作效率低下,为了弥补,DX9显卡中ALU常被设置为1D+3D 2D+2D等形式如上图。
为了进一步提高并行度,可以增加流水线的条数。多条流水线可以在单一控制部件的集中控制下运行,也可以独立运行。在单指令多数据流(SIMD)的结构中,单一控制部件向每条流水线分派指令,同样的指令被所有处理部件同时执行。SIMD架构可以用较少的晶体管堆积出庞大规模的流处理器,同时SIMD架构可以用最少的晶体管换取最大的浮点吞吐量值。但是在指令执行效率方面,SIMD架构非常依赖于将离散指令重新打包组合的算法和效率,正所谓有得必有失。
MIMD标量架构需要占用额外的晶体管数,在流处理器数量和理论运算能力方面比较吃亏,但却能保证超高的执行效率;SIMD超标量架构可以用较少的晶体管数获得很多的流处理器数量和理论运算能力,但执行效率方面要依具体情况而定。
MIMD结构流处理器指令细节
● MIMD结构流处理器指令细节
和ATI延续传统架构的思路形成非常明显的差异,NVIDIA在G80时代使用了全新的设计思想,它认为优化ALU阵列的结构才能换取更大的性能提升,而一味追求数量的增长无法永远延续较高的图形处理加速比。以下我们着重讨论G80和R600的统一着色单元而不考虑纹理单元,ROP等因素。
G80 GPU中安排了16组共128个统一标量着色器,被叫做stream processors,后面我们将其简称为SP。每个SP都包含有一个全功能的1D ALU。该ALU可以在一周期内完成乘加操作(MADD)。也许有人已经注意到了,在前面传统GPU中VS和PS的ALU都是4D的,但在这里,每个SP中的ALU都是1D标量ALU。
NVIDIA G80架构流处理器
这就是很多资料中提及的MIMD(多指令多数据)架构,G80走的是彻底的标量化路线,将ALU拆分为了最基本的1D 标量ALU,并实现了128个1D标量SP,于是,传统GPU中一个周期完成的4D矢量操作,在这种标量SP中需4个周期才能完成,或者说,1个4D操作需要4个SP并行处理完成。这种实现的最大好处是灵活,不论是1D,2D,3D,4D指令,G80得便宜其全部将其拆成1D指令来处理。指令其实与矢量运算拆分一样。
例如一个4D矢量指令 ADD R0.xyzw , R0,R1 R0与R1矢量相加,结果赋R0
G80的编译器会将其拆分为4个1D标量运算指令并将其分派给4个SP:
ADD R0.x , R0,R1
ADD R0.y , R0,R1
ADD R0.z , R0,R1
ADD R0.w, R0,R1
综上:G80的架构可以用128X1D来描述。这种流处理器设计方式抛弃了单独追求浮点吞吐的目标,转而优化流处理器内部结构来换取更高的执行效率。但是它也有明显的问题就是需要使用更多发射端和周边寄存器资源来支撑这种被“打散”的流处理器运行,芯片集成度和面积相对于ATI都有较大提升,必须严格控制发热和功耗。
R600时代对SIMD架构补充与优化
● R600时代对SIMD架构补充与优化
R600的实现方式则与G80有很大的不同,它仍然采用SIMD架构。在R600的核心里,共设计了4组共64个流处理器,但每个处理器中拥有1个5D ALU,其实更加准确地说,应该是5个1D ALU。因为每个流处理器中的ALU可以任意以1+1+1+1+1或1+4或2+3等方式搭配(以往的GPU往往只能是1D+3D或2D+2D),co-issue模式的应用更为灵活。
R600到R800统一渲染流处理器架构
ATI将这些ALU称作streaming processing unit,因而,ATI宣称R600拥有320个SPU。我们考虑R600的每个流处理器,它每个周期只能执行一条指令,但是流处理器中却拥有5个1D ALU。ATI为了提高ALU利用率,采用了VLIW体系(Very Large Instruction Word)设计。将多个短指令合并成为一组长的指令交给流处理器去执行。例如,R600可以5条1D指令合并为一组5DVLIW指令。
对于下述指令:
ADD R0.xyz , R0,R1 //3D
ADD R4.x , R4,R5 //1D
ADD R2.x , R2,R3 //1D
R600也可以将其集成为一条VLIW指令在一个周期完成。
综上:R600的架构可以用64X5D的方式来描述。
G80将操作彻底标量化,内置128个1D标量SP,每个SP中有一个1D ALU,每周期处理一个1D操作,对于4D矢量操作,则将其拆分为4个1D标量操作。R600仍采用SIMD架构,拥有64个SP,每个SP中有5个1D ALU,因而通常声称R600有320个PSU,每个SP只能处理一条指令,ATI采用VLIW体系将短指令集成为长的VLIW指令来提高资源利用率,例如5条1D标量指令可以被集成为一条VLIW指令送入SP中在一个周期完成。
两种结构流处理器优劣对比
现在的AMD,最大的追求就是在尽可能保证小尺寸核心的基础上,提供尽可能多的性能。或者这话应该换一种方式说——堆垛晶体管的临界点,出现在增加晶体管所导致的性能增加出现拐点的那一刻。当堆垛晶体管所能够换来的性能增幅明显下降的时候,就停止堆垛晶体管。
疯狂的ALU运算器规模堆砌,让NVIDIA毫无招架之力,同时坚持以效率致胜的MIMD结构流处理器长期无法摆脱晶体管占用量大的烦恼,运算器规模无法快速增长。Fermi架构完全放弃了一味追求吞吐的架构设计方向,这一点在通用计算或者说复杂的Shader领域值得肯定,但是遇到传统编程方式的图形运算,还是因为架构过于超前显得适应性不足。
RV770可以说是AMD化腐朽为神奇的力作,较之R600,RV770不仅将公共汽车一般缓慢的Ringbus换成了高速直连的Crossbar,而且还追加了大量的资源,比如为16个VLIW CORE配置了16K的Local Data Share,同时将原有的Global Data Share容量翻倍到了16K,在此基础上,还将VLIW CORE规模整体放大到了R600的250%(320个提升到800个),另外,在后端配置的RBE单元以及更加完善的TA/TF也促成了RV770的脱胎换骨。
GT200和RV770运算单元架构
在扩展ALU资源的基础之上,AMD还在做着另外一件事,那就是尽一切可能逐步优化较为古老和低效的SIMD结构。在RV7中对LDS的空间直接读写操作管理等改进就是这类努力地开始。这导致了R600和R700在Shader Program执行方面有很大差别。R600的Shader Program是Vertical Mode(5D)+Horizontal Mode(16x5D)的混合模式。而RV770是单纯的Vertical Mode(16x4D=64D & 16*1D=16D,即64D+16D)。
简单的说,RV770更加趋紧于NV50 Shader Unit的执行方式,而R600则相去甚远。总的来说,NV更加趋紧于使用基于硬件调度器的Superscalar方式来开发ILP,而AMD更加趋紧于基于软件编译器调度的VLIW方式来开发ILP。
到了RV870架构,AMD控制甚至紧缩资源,然后靠制程来拼规模,并最终让SIMD尽可能接近通过暴力吞吐掩盖延迟的最理想结局。然后就出现了我们现在看到的拥有1600个流处理器,体积却依然小于Fermi架构GF100的Radeon HD5870显卡。
AMD从R600核心开始,一直延续着上述理念设计GPU产品,R600身上有很多传统GPU的影子,其Stream Processing Units很像上代的Shader Units,它依然是传统的SIMD架构。这些SIMD架构的5D ALU使用VLIW技术,可以用一条指令完成多个对数值的计算。
由于内部的5个1D ALU共享同一个指令发射端口,因此宏观上R600应该算是SIMD(单指令多数据流)的5D矢量架构。但是R600内部的这5个ALU与传统GPU的ALU有所不同,它们是各自独立能够处理任意组合的1D/2D/3D/4D/5D指令,完美支持Co-issue(矢量指令和标量指令并行执行),因此微观上可以将其称为5D Superscalar超标量架构。
SIMD虽然很大程度上缓解了标量指令执行效率低下的问题,但依然无法最大限度的发挥ALU运算能力,尤其是一旦遇上循环嵌套分支等情况,SIMD在矢量处理方面高效能的优势将会被损失殆尽。同时VLIW的效率依赖于指令系统和编译器的效率。SIMD加VLIW在通用计算上弱势的原因就在于打包发送和拆包过程。
NVIDIA从G80开始架构作了变化,把原来的4D着色单元彻底打散,流处理器不再针对矢量设计,而是统统改成了标量运算单元。每一个ALU都有自己的专属指令发射器,初代产品拥有128个这样的1D运算器,称之为流处理器。这些流处理器可以按照动态流控制智能的执行各种4D/3D/2D/1D指令,无论什么类型的指令执行效率都能接近于100%。
AMD所使用的SIMD结构流处理器,具有非常明显的优势就是执行全4D指令时简洁高效,对晶体管的需求量更小。而NVIDIA为了达到MIMD流处理器设计,消耗了太多晶体管资源,同时促使NVIDIA大量花费晶体管的还有庞大的线程仲裁机制、端口、缓存和寄存器等等周边资源。NVIDIA为了TLP(线程并行度)付出了太多的代价,而这一切代价,都是为了GPU能更好地运行在各种复杂环境下。
但是业界普通的共识是SIMD结构的流处理器设计能够有效降低晶体管使用量,特别是在已经设计好的架构中扩展流处理器数量的难度,比起MIMD结构要容易很多。对比R600和G80架构可知,4个1D标量ALU和1个4D矢量ALU 的理论运算能力是相当的,但是前者需要4个指令发射端和4个控制单元,而后者只需要1个,如此一来MIMD架构所占用的晶体管数将远大于SIMD架构。
R300以来的芯片架构及其影响
● R300以来的芯片架构及其影响
作为第一代DirectX 9产品,R300及其各种派生产品让对手NVIDIA吃尽苦头。时至两三年之后,基于R300体系架构的Radeon9800 PRO、Radeon9800SE等产品依然在市场上长盛不衰。加之当时AMD推出第一款X86-64架构处理器——Athlon 64,整个市场都在为“双A”巨头的飞速发展而惊喜。
R300的成功一方面基于产品的设计简洁明快,另一方面则是ATI市场把控决策能力的集中体现。Radeon 9700(R300)图形芯片采用了0.15微米制程,完全遵循DirectX 9,也就是说R300管道从头到尾完全浮点化,大大增加了内核晶体管的数目。完全浮点化的管线加上内核集成的8条渲染管道,使得R300芯片内核集成的晶体管数目超过了1亿1千万个,这超越了当时任何一款GPU的集成度,这毫无疑问是当时架构最为复杂的一款GPU。
2002年底微软发布的DirectX 9.0中,PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的Vertex Shader(顶点着色引擎)编程将比以前复杂得多,新的Vertex Shader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。DirectX 9.0从技术规格上看似乎没有DX7和DX8那种让人眼前一亮的革命性技术,它只是将Shader Model版本从1.0升级到2.0而已。其实不然,此次Shader Model指令集的改进让图形渲染画质提高到了新的水平。
R300架构着色器单元
首先,Pixel Shader 2.0具备完全可编程架构,能对纹理效果即时演算、动态纹理贴图,还不占用显存,理论上对材质贴图的分辨率的精度提高无限多;另外PS1.4只能支持28个硬件指令,同时操作6个材质,而PS2.0却可以支持160个硬件指令,同时操作16个材质数量,新的高精度浮点数据规格可以使用多重纹理贴图,可操作的指令数可以任意长,电影级别的显示效果轻而易举的实现。
其次,Vertex Shader 2.0通过增加顶点指令的灵活性,显著的提高了老版本的顶点性能,新的控制指令,可以用通用的程序代替以前专用的单独着色程序,效率提高许多倍;增加循环操作指令,减少工作时间,提高处理效率;扩展着色指令个数,从128个提升到256个。
另外,增加对浮点数据的处理功能,以前只能对整数进行处理,这样提高渲染精度,使最终处理的色彩格式达到电影级别。突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。
R300的简洁高效是竞争对手难以比拟的,虽然当时的它不支持IEEE提出的精度标准,但是它成功地影响了微软。同时R300还深刻影响到了ATI后来的GPU架构发展。我们现在回顾R300架构的设计可以这样认为,ATI首先在DirectX7.0和8.0时代预测到了未来的应用环境和GPU发展规律,其次通过增强研发团队实力设计出一款符合未来应用的架构,它用合理的芯片规模换取了巨大的性能提升;最不可忽视的一点是ATI通过超越以往的公关能力影响了微软对于DirectX标准的制定,达到了硬件与编程环境的高度统一。
ATI第一代统一渲染架构Xenos
● ATI第一代统一渲染架构Xenos
R300的成功为ATI赢得了另一份荣誉,那就是微软的信任。同为2003年,ATI和微软宣布了一份开发协议——由ATI来为当时的下一代主机XBOX开发业界尖端的图形单元Xenos。这打破了先前微软和NVIDIA的合作关系,意味着XBOX下一代主机的图形部分将更换一位新的合伙人。到了2005年,微软透露360将使用由ATI设计的专用图形单元,它工作在500MHz的时脉上,拥有48条统一着色器和10M嵌入式内存。
Xenos实物拆解(图片来自驱动之家)
Xenos是微软与ATI的合作结晶,于2005年发布在XBOX360游戏主机中。这款GPU最大的特色是采用了统一着色器单元架构,顶点、像素着色器程序都在同样的单元上执行,由线程调度器作动态的资源分配,还引入了顶点纹理拾取(VTF单元)等ATI同期R5XX产品所不具备的特性。作为区别与当时所有其他GPU产品的最大特征,Xenos首次将Pixel Shader(顶点着色器)、Vertex Shader(像素着色器)和Geometry Shader(几何着色器),三种具体的硬件逻辑整合为一个全功能的着色器Shader,所以我们将其称为ATI第一代统一渲染架构。
XBOX360图形芯片分成2个核心,1个核心是主要的着色核心,采用TSMC 90nm工艺,这个核心负责大部分的图形操作和着色程序处理的ALU 排列。这个核心集成2亿3千2百万晶体管。面积较小的核心采用NEC 90nm工艺,负责所有的样本操作(如色彩读取/混合/写入,多采样AA,Z操作等等),小核心内建1亿晶体管和10MB eDRAM,带宽256GB/s。其中10MB eDRAM占去了8千万晶体管数量。
从最终产品的角度讲,Xenos成功完成了历史使命,XBOX360游戏主机相对于之前的各种硬件游戏平台获得了大幅度性能提升;同时Xenos所采用的封装模式让GPU核心面积不至于过大,提高了良品率。从架构设计方面回顾,Xenos大胆启用高速eDRAM冲破了当时的存储器墙,同时在一款核心面积较小的芯片上试水统一渲染架构为后来R600到R800架构的发展做出重要积累。
统一渲染GPU R600临危受命
● 临危受命的统一渲染PC GPU R600
代号G80的GeForce 8800 GTX相对于上一代产品,几乎经过了重新设计,各方面的改进都非常大。而R600家族的体系架构在一定程度上可以看作是延续自Xenos。
但是ATI在2006年7月24被AMD收购以及它之前的研发精力不足,直接影响了R600家族产品的开发受到很大影响。最后导致没有统一架构设计经验的NVIDIA在2006年11月8日成功发布了G80核心的GeForce 8800 GTX显卡,巨大的技术革新和性能提升,获得了用户的一致认同。
至今耳熟能详的G80架构GeForce 8800 GTX显卡
G80架构使用了多指令流多数据流MIMD结构标量流处理器,一共128个流处理器替代了原来分立的Vertex Shader和Pixel Shader,拥有当时最强的性能,当然G80拥有6.81亿个晶体管,是G71的2.5倍之多,显存方面384Bit显存位宽也充分保证了数据吞吐能力。在性能上GeForce 8800GTX显卡把3D图形处理器的性能又引领到一个前所未有的高度,这给对手承重的打击,ATI竟在半年之内拿不出一款足以抗衡G80核心的产品。NVIDIA凭借G80的革命性架构毫无悬念的夺取了3D性能的制高点。
直到2007年6月3日,AIT终结了长达7个月的等待时间,Radeon HD 2000家族终于发布。业内第一片DX10 GPU的头衔被G80抢了去,不过ATI这次也没有完全被NVIDIA牵着鼻子走。除了对DX10和统一着色架构的支持外,R600还加入了一些特有的功能。例如,独立于几何着色器(Geometry Shader)的专用曲面细分单元(tessellation),加入属于Direct X 10.1范畴的可编程AA功能等。
R600架构在最后的设计阶段,已经发现了明显的问题,那就是SIMD结构的流处理器在使用了VLIW之后,过分依赖指令系统和编译器的效率。如果说流处理器数量足够多,则可以在宏观上抑制这种性能下降,但是R600但是只有320个流处理器。
并且受制于台积电的80纳米高速版(80HS)工艺,加之R600集成了大约7亿枚晶体管这个不小的数量,R600最后的工作频率在一味追求GFLOPS浮点吞吐量的前提下达到了740MHz,并且为512Bit显存通道配备多达16颗显存……以上各种因素影响最终让R600架构的高端代表产品Radeon HD 2900 XT的整张显卡提升到高达225W。
AMD对GPU架构的不断改进和优化
● AMD对GPU架构的不断改进和优化
2007年6月3日,AIT终结了长达7个月的等待时间,Radeon HD 2000家族终于发布。业内第一片DX10 GPU的头衔被G80抢了去,不过ATI这次也没有完全被NVIDIA牵着鼻子走。除了对DX10和统一着色架构的支持外,R600还加入了一些特有的功能。例如,独立于几何着色器(Geometry Shader)的专用曲面细分单元(tessellation),加入属于Direct X 10.1范畴的可编程AA功能等。
80nm工艺制造的Radeon HD 2900 XT
R600架构在最后的设计阶段,已经发现了明显的问题,那就是SIMD结构的流处理器在使用了VLIW之后,过分依赖指令系统和编译器的效率。如果说流处理器数量足够多,则可以在宏观上抑制这种性能下降,但是R600但是只有320个流处理器。
RV770可以说是AMD化腐朽为神奇的力作,较之R600,RV770不仅将公共汽车一般缓慢的Ringbus换成了高速直连的Crossbar,而且还追加了大量的资源,比如为16个VLIW CORE配置了16K的Local Data Share,同时将原有的Global Data Share容量翻倍到了16K,在此基础上,还将VLIW CORE规模整体放大到了R600的250%(320个提升到800个),另外,在后端配置的RBE单元以及更加完善的TA/TF也促成了RV770的脱胎换骨。
代号RV670的工艺改进版显卡 Radeon HD3870
在扩展ALU资源的基础之上,AMD还在做着另外一件事,那就是尽一切可能逐步优化较为古老和低效的SIMD结构。在RV7中对LDS的空间直接读写操作管理等改进就是这类努力地开始。这导致了R600和R700在Shader Program执行方面有很大差别。R600的Shader Program是Vertical Mode(5D)+Horizontal Mode(16x5D)的混合模式。而RV770是单纯的Vertical Mode(16x4D=64D & 16*1D=16D,即64D+16D)。
2009年09月23日,AMD为我们带来了基于DirectX 11的Radeon HD5870显卡。它采用第二代40nm工艺制造、搭载第四代GDDR5显存、拥有1600个流处理器、Eyeinfinty多屏显示技术、超低待机功耗等。最为关键的是Radeon HD5870满足了DirectX 11的一切设计要求,同时取得了对NVIDIA上一代顶级单卡Geforce GTX285的全面领先。
定位出色的Radeon HD 4850
除了规模上的扩张,RV870还竭力弥补了R600架构之前遗憾。过去,由于过分注重成本,从R600开始AMD家族的通用运算能力就落后对手不少。AMD在RV870上着重改进了这一点,新加入的LDS(Local Data Share)有效提升了存储性能,改善了流处理器的执行效率。RV870不但支持微软DirectCompute和苹果OpenCL通用计算平台,还重新优化了数据共享结构,提供了完整的多级缓存供流计算使用,并且优化了访存能力。抢占式多线程虽然在技术层面略逊于Fermi的多级多分配并行多线程设计,但是就技术的标准来讲,RV870与对手站到了同一起跑线上。
AMD从R600核心开始,一直延续着上述理念设计GPU产品,R600身上有很多传统GPU的影子,其Stream Processing Units很像上代的Shader Units,它依然是传统的SIMD架构。这些SIMD架构的5D ALU使用VLIW技术,可以用一条指令完成多个对数值的计算。
当之无愧的一代显卡王者 Radeon HD 5870
由于内部的5个1D ALU共享同一个指令发射端口,因此宏观上R600应该算是SIMD(单指令多数据流)的5D矢量架构。但是R600内部的这5个ALU与传统GPU的ALU有所不同,它们是各自独立能够处理任意组合的1D/2D/3D/4D/5D指令,完美支持Co-issue(矢量指令和标量指令并行执行),因此微观上可以将其称为5D Superscalar超标量架构。
SIMD虽然很大程度上缓解了标量指令执行效率低下的问题,但依然无法最大限度的发挥ALU运算能力,尤其是一旦遇上循环嵌套分支等情况,SIMD在矢量处理方面高效能的优势将会被损失殆尽。同时VLIW的效率依赖于指令系统和编译器的效率。SIMD加VLIW在通用计算上弱势的原因就在于打包发送和拆包过程。
AMD所使用的SIMD结构流处理器,具有非常明显的优势就是执行全4D指令时简洁高效,对晶体管的需求量更小。而NVIDIA为了达到MIMD流处理器设计,消耗了太多晶体管资源,同时促使NVIDIA大量花费晶体管的还有庞大的线程仲裁机制、端口、缓存和寄存器等等周边资源。NVIDIA为了TLP(线程并行度)付出了太多的代价,而这一切代价,都是为了GPU能更好地运行在各种复杂环境下。
NVIDIA在最近3年中更新了3次GPU硬件架构,它们分别是:
● 面向DirectX 10游戏设计以G80G92为主的第一代统一渲染架构
● 面向游戏和通用计算并重的GT200架构(不包含GT210 220 240)
● 面向大规模并行计算和游戏并重的Fermi GF100架构
而ATI在最近3年中,成功推出了4款GPU硬件架构,它们分别是:
● HD2000系列第一代统一渲染架构
● HD3000系列平衡和改进型统一渲染架构
● HD4000系列扩张型优化后端和增添LDS缓冲架构
● HD5000系列支持DirectX 11放大版优化通用计算统一渲染架构
几乎在每一代架构更替中,AMD都能通过其强大的细分市场能力制造出数量庞大而又密集的GPU产品线,NVIDIA的产品线则相对于单一,特别是在1000元以下市场很容易被对手包围。
AMD强大的细分市场能力已经无数次得到市场验证,特别是HD5000系列产品中,在确认了HD5870的优势之后,AMD不断细化市场,诞生了以下几个定位卓越市场控制力优秀的产品:
AMD密集的产品线规划
● HD5970 单卡双芯设计,代表了目前单卡GPU顶级性能;
● HD5870 最强单卡单芯设计,在功耗和发热可控的情况下提供优秀的3D性能
● HD5830 高性能级别GPU产品,流处理器数量精简到1120个,让用户可以用更低的价格买到高端GPU;
● HD5770 拥有和GTX260+相仿的性能,但是999元的售价非常切合主流用户的消费心理;
● HD5670 超越NVIDIA的GT240,和9800GT平起平坐,价格上具有一定优势;
● HD5550 在500价位上提供了DirectX 11、Eyefinity和Stream等技术支持,320个流处理器让它压制了对手GT220的进攻,超低价格和新技术是主要卖点。
未来ATI图形芯片架构预测
● 未来ATI图形芯片架构预测
我们根据各方面的情报综合考虑,下一代即将到来的“Southern Island”(“南岛”)还是延续R600架构,但是把曲面细分单元(Tessellator)放在VLIW Core中,这是一次非常难得的改进。但同时这也是南岛的极限。因为要把固定功能单元要挂到VLIW Core中,就要有独立的总线连接、独立的资源、寄存器、端口,也就是说独立的线程仲裁分配能力。
在VLIW Core中实现独立仲裁分配能力,是AMD一直希望在GPU中做到的,如果能做到这一点,那AMD或许能够借此实现更深级别的乱序执行,这基本上就和NVIDIA站在同一起跑线。同时如果把曲面细分单元(Tessellator)放在VLIW Core中,曲面细分能力将伴随芯片规模而变化,高中低端显卡将拥有各自不同的曲面细分能力。这和NVIDIA将曲面细分单元(Tessellator)放在SM中是一个道理。
AMD下代“南岛”架构两种设计方向推测
如果南岛无法一次性将曲面细分单元(Tessellator)放在VLIW Core中,可以选择另外一种途径,那就是对GPU内部单元进行分频。正如NVIDIA将CUDA Cores的频率以两倍于固定单元频率运行一样,AMD可以选择将几何性能较弱的Setup Engine和Tessellator等单元按一定幅度提升频率。
或者将GPU的前端超线程发送器(Ultra Threaded Dispatch Processor)整体频率提升,这样曲面细分单元自然也会受益,同时GPU的几何处理能力会得到线性增强。
但是也有一种说法认为AMD没有能力在HD6000芯片的VLIW Core级别中添加更多的essellator单元,因为线程仲裁能力背后的设计还很复杂,比如足够的挂起空间。仲裁器本身没多少晶体管,这种资源基本上都是LDS,寄存器也是。所以R800使用了抢占式多线程,但是速度和效率还是得不到保障。
另一种猜想已经被我们否定,那就是在现有的前端超线程发送器(Ultra Threaded Dispatch Processor)中添加一个曲面细分单元(Tessellator)。因为这需要两套独立的crossbar,以及在VLIW Core外设置独立的出口,最后还要设置抢占式多线程分配单元。
所以我们可能看到HD6000系列在流处理器规模与HD5000系列相同的情况下,在Direct X 10和Direct X 9性能方面落后于HD5000,但是由于几何能力的提升,在Direct X 11方面,会有较为出色的表现。这一点和Fermi架构的设计思路是非常接近的。
在南岛架构完成之后,我们将见到相对于目前R600-R800转变较大的北岛架构(Northern Island),根据现有的情报推断,北岛有可能是曾经的C1(代号Xenos架构)放大版。ATI可能会将RV8的US全部取出,把C1的3D+1D的流处理器和高速eDRAM放入核心。按照R600到R800以来的流处理器利用率,ATI认为4D+1D结构利用率很低,完全可以使用更灵活的搭配来减少晶体管消耗,这可以看做是一次向R300架构简洁明快设计思路的回归。
同时北岛架构的eDRAM不是做cache,是做全局存储,也就是我们看到的显存。2005年设计完成的C1(代号Xenos架构)所采用的eDRAM已经有250GB/s以上的带宽了。如果北岛架构使用现在的eDRAM,带宽翻倍甚至接近800GB/s都是可以做到的。当然使用高速eDRAM之后显存容量将会降低,也许我们看到北岛架构只有100MB左右的显存。不过用户不必担心纹理材质的存放问题,在Xenos时代借助eDRAM极高的带宽,整个XBOX360的GPU全局存储只有10MB。快速刷新显存实际上等效于显存容量的放大,加之高效的材质压缩算法,物理显存只要能够容纳最大材质就能满足GPU需求。
第三章:GPU通用计算发展与细节
● 第三章:GPU通用计算发展与细节
从世界上第一款GPU横空出世到今天,显卡已经走过了10年历史。GPU在这10年演变过程中,我们看到GPU从最初帮助CPU分担几何吞吐量,到Shader单元初具规模,然后出现Shader单元可编程性,到今天GPU通用计算领域蓬勃发展这一清晰轨迹。
这10年包含了无数设计者艰辛努力的成果,GPU也用自己的发展速度创造了半导体行业的奇迹,而GPU当今成就的见证者,正是我们的无数硬件玩家和游戏爱好者。我们可以肯定以GPU诞生初期的设计定位和市场需求,没有人敢相信今天GPU能走上通用计算这条道路,正所谓无心插柳柳成荫。
站在今天回看GPU通用计算历史,是GeForce2首开了GPU通用计算的先河,凭借其强大的多纹理处理性能,结合纹理环境参数和纹理函数可以实现一些很灵活的应用。GeForce2当时首先被用于求解数学上的扩散方程,成为GPU通用计算的最早应用。
对GPU通用计算进行深入研究从2003年开始,并提出了GPGPU概念,前一个GP则表示通用目的(General Purpose),所以GPGPU一般也被称为通用图形处理器或通用GPU。随着GPU Shader单元计算能力的不断增长,一场GPU革命的时机也成熟了。
2005年,ATI改进型架构R580仅仅在晶体管数量只增加20%的情况下提供了相对R520 200%的Pixel Shader性能增长。其代表产品RADEON X1900XTX的FP32计算能力总共会是426.4 GFLOPS——R580因此得名“3:1黄金架构”。2006年,Folding@Home项目首先宣布提供对ATI Radeon X1900产品的支持。在显卡加入Folding@Home项目后,科研进展速度被成倍提升,人们第一次感受到了GPU的运算威力。
在经历了R600的失落之后,2007年末新发布的代号RV670的Radeon HD 3000让我们看到了ATI的愿景和希望。这一代产品添加了双精度浮点能力支持,同时基于统一渲染架构的ATI Firestream 9000系列产品问世,用更小的集成度换取更高的浮点吞吐量已经成为ATI追求的目标,并行计算Firestream产品得到了硬件基础性支撑,编程环境和编译器优化稳步进行。
多核并行计算困惑与发展
● 多核并行计算困惑与发展
多核并行计算技术是当前计算机领域的研究热点。在未来数年内.随着芯片内核数量持续增长,多核计算将成为一种广泛普及的计算模式。它使计算机的计算能力显著提升,具有巨大的发展潜力和广阔的应用空间。当前,CPU主频的提升由于生产工艺和散热问题而受到严重的制约,处理器性能的改善已主要向着多核体系发展。
个人电脑使用者要想真正获得多核处理器带来的高效率,软件的发展必须跟上硬件的步伐,当前多核处理器软件总体滞后于硬件。传统的单线程串行计算软件只能导致多核的闲置,只有在算法设计及软件开发能够充分利用多核处理器的特性时,其优势才能真正体现出来。
在大规模并行计算领域,软件并不是并行化的制约趋势,传统架构的CPU无法获得更高的每瓦特性能才是致命伤,即使是使用了RISC架构处理器,超级计算机面对21世纪重大课题仍然显得手足无措。所以放大规模,换而言之为超级计算机添加更多的处理器或增加节点成为唯一可行的选择……
传统的超级计算机性能增长模式
在2003年单核心性能提升达到极限之时,2005年Intel和AMD共同在主流消费市场推出了旗下的双核心处理器,2007年推出4核心处理器,到现在Intel推出8核,AMD推出6核,PC机已经越来越像一个小型集群。但是与此同时,多核架构对现有的系统结构也提出新的挑战,如存储器壁垒、芯片、板极、系统级均衡设计以及可移植性等方面的问题。
2002年,一台耗资2.15亿美元的超级计算机在美国洛斯阿拉莫斯国家实验室运行,虽然它的运行速度高达30Tflops,但是为它提供各种制冷设备、冷却塔、空调、电源调节装置、变压器等辅助设施的建筑有好几座。这些迹象都预示着,更快的超级计算机的发展存在着一些限制,它们要求前所未有的电力供应,会产生越来越多的热量,其产生故障的机会也大增。超级计算机大约有1/3的电力支出用于散热,如果节点过密这个问题还会更加突出。
而在SIGGRAPH 2003大会上,许多业界泰斗级人物发表了关于利用GPU进行各种运算的设想和实验模型。SIGGRAPH会议还特地安排了时间进行GPGPU的研讨交流。与此同时,DirectX 9 Shader Model 3.0时代,新的Shader Model在指令槽、流控制方面的显著增强使得对应GPU的可编程性能得到了大大的提升。GPGPU的研究由此进入快车道。
GPU已经能够作为服务器模块
GPU被用于通用计算是经济发展的产物,也是历史的必然。首先传统CPU遭遇到频率提升困难,核心数目提升困难等一系列难题,同时大规模并行计算领域的性能需求越来越旺盛,传统性能增长模式无法延续下去。而此时的GPU拥有了可编程浮点执行单元、随后又通过整合多种着色器扩大了可编程浮点单元的规模和运算能力,再往前发展寄存器数量和调度能力增强让浮点精度得以完善,到现在我们看到基于GPU的超级计算机系统已经越来越多地出现在TOP500榜单上。
基于AMD CPU+GPU异构计算平台
● 基于AMD CPU+GPU异构计算平台
通过前文分析我们得知目前的主流计算能力来自CPU和GPU。CPU与GPU一般经北桥通过PCI-E总线连接,各自有独立的外部存储器,分别是内存与显存。在一些芯片组中使用的集成GPU没有独立的显存芯片,而是用内存中划出一部分充当显存。Intel在i3系列CPU中将一颗低端GPU核心集成到CPU基板上,但是受到功耗面积发热等限制,目前Intel还无法集成规模更大的GPU。AMD提出的Fusion计划第一步也是同样道理,既不可能将一颗性能级GPU集成到CPU中,也无法为这颗GPU提供独立的显存空间。
为游戏服务的CPU+GPU异构模式
传统的CPU+GPU异构模式是为图形运算服务的,典型应用是图形实时渲染。在这类应用中,CPU负责根据用户的输入和一定的规则(如游戏AI)确定在下一帧需要显示哪些物体,以及这类物体的位置,再将这些信息传递给GPU,由GPU绘制这些物体并进行显示。两者的计算是并行的,计算过程之间没有数据传递和分享;在GPU计算当前帧的时候,CPU可以计算下一帧需要绘制的内容。
在传统的CPU+GPU异构模式中,CPU负责的是逻辑性较强的事物计算,GPU则负责计算密集型的图形渲染。为了满足这类应用的计算需求,CPU的设计目标是使执行单元能够以很低的延迟获得数据和指令,因此采用了复杂的控制逻辑和分支预测以及大量的缓存来提高执行效率;而GPU必须在有限的时间内和有效的面积上实现很强的计算能力和很强的存储器带宽,因此需要大量执行单元来运行这些相对简单的线程,同时在当前线程等待数据的时候切换到另一个处于就绪状态的等待计算的线程。简而言之,CPU对延迟更敏感,而GPU则侧重于提高整体的数据吞吐量。CPU和GPU的设计目标不同决定了两者在架构和性能上有巨大差异。
CPU和GPU在以下几个方面有着重要的差异和特色:
1、CPU核心通常在一个时刻内只能运行一个线程的指令,CPU的多线程机制通过操作系统提供的API实现,是一种软件粗粒度多线程。当一个线程中断,或者等待某种资源时,系统就要保存当前线程上下文并装载另一个线程上下文。而GPU采用的是硬件管理的轻量级线程,可以实现零开销线程切换。GPU在自身并行度提高的情况下遇到越多的线程则可以用计算隐藏存储延迟。
2、主流CPU普遍拥有2个到4个核心,每个核心拥有3-6条流水线。这些核心使用了很多提高指令级并行的技术,如超标量深度流水线、乱序执行、分支预测、缓存管理等等,也使用了诸如SSE、3Dnow!等数据级并行技术。大量晶体管用于这些技术细节的实现,所以单个核心面积较大,数目无法做大。而GPU包含数目众多的拥有完整前端的小核心,如HD5870拥有320个VLIW Core,每个VLIW Core又可以看作是5个1D流处理器组成的SIMD处理器。GPU通用计算API可以利用多个VLIW Core之间的粗粒度任务级或数据级并行,以及VLIW Core内的细粒度数据并行。
3、CPU中的缓存主要是用于减小访问存储器延迟和节约带宽。缓存在多线程环境下会发生失效反应:在每次线程上下文切换之后,后需要上下文重建,这个过程耗费了大量时钟周期。同时为了实现缓存与内存的数据一致性,需要复杂的逻辑控制来实现一致性协议。ATI GPU内目前没有复杂的缓存体系与替换机制。它的GPU缓存是只读的,ATI认为目前应用中,GPU缓存的主要功能是用于过滤对存储器控制器的请求,减少对显存的访问。所以GPU缓存的主要功能不是用于减少延迟,而是节约显存带宽。
AMD提出的CPU+GPU异构运算平台能够借此差异提供出色的整机性能,各部件能充分发挥自己的优势,处理拿手的应用,如传统的串行计算可以交给CPU负责,并行计算可通过AMD Stream流处理计算技术交给GPU运算。也就是说将来也多软件可利用GPU的大的性能为游戏、软件进行加速。目前支持AMD Stream的软件有AMD的AVIVO视频转换,而Adobe、ArcSoft、CyberLink等公司将来推出的软件将会加入AMD Stream的支持。
2009年末,AMD在面对当前的用户疑惑和对手宣传的GPU是系统核心等问题时曾经表示:“AMD的OpenCL for CPU Beta是下一代ATI Stream SDK中OpenCL开发平台的关键组成部分。预计新ATI Stream SDK将于今年晚些时候推出。我们是业界唯一一家同时提供CPU和GPU的厂商,在挖掘OpenCL潜力的道路上拥有独特的优势。通过支持OpenCL,ATI Stream技术将能够令开发者将运算负载灵活的划分到CPU或GPU上,更有效的执行程序。”
着色器模型变化历程与总结
● 着色器模型变化历程与总结
在图形渲染中,GPU中的可编程计算单元被称为着色器(Shader),着色器的性能由DirectX中规定的Shader Model来区分。GPU中最主要的可编程单元式顶点着色器和像素着色器。
为了实现更细腻逼真的画质,GPU的体系架构从最早的固定单元流水线到可编程流水线,到DirectX 8初步具备可编程性,再到DirectX 10时代的以通用的可编程计算单元为主、图形固定单元为辅的形式,最新的DirectX 11更是明确提出通用计算API Direct Compute概念,鼓励开发人员和用户更好地将GPU作为并行处理器使用。在这一过程中,着色器的可编程性也随着架构的发展不断提高,下表给出的是每代模型的大概特点。
表:Shader Model版本演化与特点
Shader Model |
GPU代表 |
显卡时代 |
特点 |
|
1999年第一代NV Geforce256 |
DirectX 7 1999~2001 |
GPU可以处理顶点的矩阵变换和进行光照计算(T&L),操作固定,功能单一,不具备可编程性 |
SM 1.0 |
2001年第二代NV Geforce3 |
DirectX 8 |
将图形硬件流水线作为流处理器来解释,顶点部分出现可编程性,像素部分可编程性有限(访问纹理的方式和格式受限,不支持浮点) |
SM 2.0 |
2003 年 ATI R300 和第三代NV Geforce FX |
DirectX 9.0b |
顶点和像素可编程性更通用化,像素部分支持FP16/24/32浮点,可包含上千条指令,处理纹理更加灵活:可用索引进行查找,也不再限制[0,1]范围,从而可用作任意数组(这一点对通用计算很重要) |
SM 3.0 |
2004年 第四代NV Geforce 6 和 ATI X1000 |
DirectX 9.0c |
顶点程序可以访问纹理VTF,支持动态分支操作,像素程序开始支持分支操作(包括循环、if/else等),支持函数调用,64位浮点纹理滤波和融合,多个绘制目标 |
SM 4.0 |
2007年 第五代NV G80和ATI R600 |
DirectX 10 2007~2009 |
统一渲染架构,支持IEEE754浮点标准,引入Geometry Shader(可批量进行几何处理),指令数从1K提升至64K,寄存器从32个增加到4096个,纹理规模从16+4个提升到128个,材质Texture格式变为硬件支持的RGBE格式,最高纹理分辨率从2048*2048提升至8192*8192 |
SM 5.0 |
2009年 ATI RV870 和2010年NV GF100 |
DirectX 11 2009~ |
明确提出通用计算API Direct Compute概念和Open CL分庭抗衡,以更小的性能衰减支持IEEE754的64位双精度浮点标准,硬件Tessellation单元,更好地利用多线程资源加速多个GPU |
传统的分离架构中,两种着色器的比例往往是固定的。在GPU核心设计完成时,各种着色器的数量便确定下来,比如著名的“黄金比例”——顶点着色器与像素着色器的数量比例为1:3。但不同的游戏对顶点资源和像素资源的计算能力要求是不同的。如果场景中有大量的小三角形,则顶点着色器必须满负荷工作,而像素着色器则会被闲置;如果场景中有少量的大三角形,又会发生相反的情况。因此,固定比例的设计无法完全发挥GPU中所有计算单元的性能。
顶点着色单元(Vertex Shader,VS)和像素着色单元(Pixel Shader,PS)两种着色器的架构既有相同之处,又有一些不同。两者处理的都是四元组数据(顶点着色器处理用于表示坐标的w、x、y、z,但像素着色器处理用于表示颜色的a、r、g、b),顶点渲染需要比较高的计算精度;而像素渲染则可以使用较低的精度,从而可以增加在单位面积上的计算单元数量。在Shader Model 4.0之前,两种着色器的精度都在不断提高,但同期顶点着色器的精度要高于像素着色器。
Shader Model 4.0统一了两种着色器,所以顶顶点和像素着色器的规格要求完全相同,都支持32位浮点数。这是GPU发展的一个分水岭;过去只能处理顶点和只能处理像素的专门处理单元被统一之后,更加适应通用计算的需求。
DirectX 11提出的Shader Model 5.0版本继续强化了通用计算的地位,微软提出的全新API——Direct Compute将把GPU通用计算推向新的巅峰。同时Shader Model 5.0是完全针对流处理器而设定的,所有类型的着色器,如:像素、顶点、几何、计算、Hull和Domaim(位于Tessellator前后)都将从新指令集中获益。
GPU执行FFT性能将在未来迅速提升
如图,快速傅里叶变换(Fast Fourier Transform,FFT)有广泛的应用,如数字信号处理、计算大整数乘法、求解偏微分方程等等。SIGGRAPH2008峰会认为未来随着Compute Shader和新硬件、新算法的加入,GPU执行FFT操作的性能将得到快速提升。
如果使用DirectX 11中的Computer Shader技术,API将能借助GPU充裕的浮点计算能力进行加速计算,则能轻易完成大量的FFT(傅里叶变换)。在图形渲染中,这项技术的运用极大地提高了波浪生成速度,而且画面质量也更好。
以往受限于浮点运算性能,目前CPU进行FFT变换只能局限在非常小的区域内,比如64x64,高端CPU最多能达到128x128,而GTX 280则能实现每帧512x512的傅里叶变换,所用时间不过2ms,效能非常高。
Shader计算能力快速发展
● Shader计算能力快速发展,灵活度不断提升
在图形渲染中,GPU中的可编程计算单元被称为着色器(Shader),着色器的性能由DirectX中规定的Shader Model来区分。GPU中最主要的可编程单元式顶点着色器和像素着色器。
为了实现更细腻逼真的画质,GPU的体系架构从最早的固定单元流水线到可编程流水线,到DirectX 8初步具备可编程性,再到DirectX 10时代的以通用的可编程计算单元为主、图形固定单元为辅的形式,最新的DirectX 11更是明确提出通用计算API Direct Compute概念,鼓励开发人员和用户更好地将GPU作为并行处理器使用。
图形流水线中可编程单元的行为由Shader单元定义,并可以由高级的Shading语言(例如NV的Cg,OpenGL的GLSL,Microsoft的HLSL)编写。Shader源码被译为字节码,然后在运行时由驱动程序将其转化为基于特定GPU的二进制程序,具备可移植性好等优势。传统的图形渲染流线中有两种不同的可编程着色器,分别是顶点着色单元(Vertex Shader,VS)和像素着色单元(Pixel Shader,PS)。表一和表二比较详细地罗列出从Shader 2.0到Shader 4.0像素着色单元和顶点着色单元的演进过程。
表二 Vertex Shader顶点着色器单元的演进
表中:PS 2.0 = DirectX 9.0 original Shader Model 2 specification。
PS
PS 2.0b = ATI Radeon X700 X800 X850 shader model,DirectX 9.0b。
PS 3.0 = Shader Model 3。
PS 4.0 = Shader Model 4。
N = NO,Y = YES。
“32+64”指32个纹理指令和64个算术指令。
揭秘GPU高性能计算关键
● 揭秘GPU高性能计算关键
高性能计算并不是纯数据吞吐,也不是纯计算密集型任务,它对计算机硬件拥有较为复杂的要求。所以单独提升单线程能力不能解决高性能并行计算需求,单纯堆积流处理器数量也无法适应未来的数据和指令环境。CPU和GPU都必须做出改变,但是我们明显能够感觉到GPU改变的代价小于CPU特别是X86架构的CPU。基本上每隔一年,GPU的架构体系就会发生一次转变,而每两代转变则代表计算能力的一次飞跃。
有效地运用计算资源的财富要涉及到多个重要目标。首先必须合理组织计算资源,使得重要的数据和指令类型获得较高的加速比。同时大量提供计算单元还远远不够;必须实现高效的通信、高效的线程管理,充足的寄存器与前端资源……这样才有可能让流处理器尽可能地被数据填充而不浪费。我们将GPU高性能计算的关键分为以下几个部分来分析:
典型的CPU内部功能单元
1、高效的计算方法
GPU核心上可以放下上百个计算单元。为了计算的目的架构设计师必须最佳利用晶体管的关键是使致力于计算的硬件最大化,并且允许多个计算单元通过并行同时操作,而且保证各个计算单元以最大效率操作。
虽然现在的半导体制程技术允许在单个芯片内放置大量晶体管以提升单核心性能或提升并行度,但资源不是无限的。我们可以广义地将晶体管的用途划分为3类:控制类(这些晶体管用于指挥操作);数据通路(Datapath,这些硬件用来执行计算);存储类(这些硬件用于存放数据)。
在数据通路之内,可以允许在相同时间的并发操作。这种技术被称为并行性。我们可以构想几个方式以利用并行性和允许同时执行。复杂的任务比如图形处理,一般由几项连续的任务组成,当运行这些应用时,我们能够在不同的数据上同时运行几个这样的任务(任务并行性)。在一个阶段之内,如果在几个数据元素上执行一个任务,我们能够利用数据并行性同时对数据求值。而在一个数据元素的复杂求值之内,能够同时求值几个简单操作(指令并行性)。
2、高效的通信方法
GPU芯片外的存储器速度总是无法跟上GPU算术能力的增长幅度,所以作为一颗高性能处理器,GPU必须要想办法突破这道“存储器墙”,必须尽量减少芯片外通信以节能带宽降低延迟。为了逼近终极目标“消灭片外通信”,也就是尽量只在芯片内部进行数据通信,芯片外通信只用于获取或者保存真正的全局数据。
在GPU内部加入Cache是一种有效的方式:最近使用的数据的副本可以由存储器传递到Cache中并根据替换协议不断更改。Cache由于对晶体管消耗较大,缓存协议难以实现,一直是GPU设计的重要障碍之一。比如在GPU上经过几代尝试已经成熟的Texture cache可以存放纹理,又如NVIDIA在G80架构中加入的Shared Memory和AMD在RV770架构加入的LDS(Local Data Share)。这个共享寄存器位于每个流处理器单元内部的所有运算单元中,它在通用计算时负责共享数据和临时挂起线程。容量足够大的共享缓存可以在运算时提高线程的挂起能力,还有很多东西比如乱序,分支等等都会受益于Cache的加入。
CPU与GPU的区别和发展方向
● CPU与GPU的区别和发展方向
GPU作为今天的高性能处理器在设计方面已经和以往的图形流水线有着不同的目标,它已经开始瞄准通用计算程序。一般来讲,这类程序相对于图形运算的并行度不是很整齐,甚至并行度有所下降,需要较为复杂的控制和较低的性能目标。
CPU编程模型一般是串行的,在它们的应用程序中不会充分地利用数据并行性。CPU硬件反应了这种编程模型:在常见的情况中,CPU在同一时刻只处理一个数据,不利用数据并行性。而最近几年的SSE和最新的AVX指令集提高了数据并行执行能力,但是CPU所利用的并行程度还是远小于GPU。
并行硬件在CPU数据通路中较不流行的一个原因是设计者把更多的晶体管用于控制硬件。CPU程序比GPU程序所要求的控制要复杂很多,多以CPU的晶体管和连线有很大一部分用于实现复杂的控制功能,如分支预测和乱序执行。结果CPU的核心只有很少一部分用于运算。由于CPU的目标是通用程序,所以它们不为特殊功能包含专门的硬件。而GPU可以为特殊任务实现专用硬件结构,这些固定功能单元远比通用可编程方案提供的效率高的多。我们可以从上一页的两张图片中看出CPU和GPU对晶体管的使用。
最后,CPU内存系统被优化为极小的延迟而不是GPU内存系统瞄准的最大吞吐量。由于缺乏并行性,CPU程序必须尽快返回内存以继续前进。结果,CPU内存系统包含几级Cache以最小化延迟。然而Cache对很多数据类型是无效的,包括图形输入和只访问一次的数据。对于图形流水线,为所有元素最大化吞吐量而不是为所有元素最小化延迟,会提升内存系统的使用率和高性能计算的整体实现。
每代新硬件对于GPU厂商来说都是一个挑战:他们如何有效地使用附加的晶体管资源来增加性能和功能?新的晶体管增量将致力于增加性能,但是架构师必须清醒地认识到这些晶体管该如何给运算单元、控制单元和存储单元分配以达到最佳效能。如果不能平衡这种压力,或者对未来的应用分析导致整个设计思路发生偏差,那么对于下一代GPU产品将是很严重的打击。
GPU的功耗增长同样是可怕的问题,2003年上市的GeForce FX 5800 Ultra是第一款遇到功耗问题的GPU,或者说业界第一次感受到功耗问题的严重性。此后的大芯片设计还有Radeon X1900和DirectX 10时代的大部分芯片。ITRS从2003年开始大家力度关注功耗对于芯片设计的影响,而2009年的报告已经将逻辑器件的按比例缩小引起的漏电、短沟效应、材料适应性等问题列为半导体设计面临的严峻考验。而GPU作为数倍超越摩尔定律发展的大型芯片,其表现更加令人担忧。
几何与渲染代表了GPU的两大功能区
在可编程性方面,虽然近几年的GPU设计已经足够多的照顾到了并行计算领域的需求,但是GPU的可编程性仍然较弱。从数量上说,统一渲染着色器(Unified Shader)和固定功能单元(Fixed Function)是GPU的两个主要部分,而大部分固定功能单元是无法可编程利用的。从深度来来说,虽然我们在NVIDIA新开发的Fermi架构中看到了统一定址和全能缓存等设计,但是GPU所能够涉及到的并行计算程序仍然需要使用专门的API和较为低级的语言开发,程序员对于运用GPU的缓存和其他特性仍然显得手足无措,更何况还要避免分支的出现和适应复杂的GPU存储体系。
从发展历程来看,GPU已经包括了原先属于CPU的功能。早期的消费级图形硬件在图形处理器上甚至无法执行几何处理,今天已经能够借助固定功能单元来实现了。虽然GPU功能主要增加方向是图形流水线中的可编程性,但是GPU设计者仍然在把更多功能放在GPU上执行。尤其是今天的游戏需要大量的物理特效和人工智能计算或者图像后处理(Post Process)。这些计算任务在GPU上完成拥有更高的加速比,是相当有吸引力的。
未来的高性能处理器市场将因为GPU的飞速发展变得更有看点,当GPU将越来越多原来在CPU上的应用转移到自己身上时,CPU也不会停滞不前。虽然它拥有较高的通用性,但是CPU的并行能力也在提升,这种提升不会停滞不前。未来CPU与GPU厂商的冲突将会愈演愈烈。计算机系统的资源分配是偏向CPU还是GPU?GPU是否会因为通用性的提高而替代CPU?还是CPU也变身为几百个核心的高能处理器来对抗GPU?这些令人兴奋的问题将会是未来处理器体系结构设计者面临的重要选择。
如何将GPU功能单元映射为通用单元
● 如何将GPU功能单元映射为通用单元
基于GPU的计算从概念上讲很容易理解,并且现有多种高级语言和软件工具可以简化GPU的编程工作。但是开发人员必须首先了解GPU在图像绘制过程中是如何工作的,然后才能确定可用于计算的各个组件。为了着手把一般性的计算映射到GPU的专用硬件中,必须先确定GPU提供的各种计算资源,下面我们将简单了解GPU通用计算中各硬件系统的作用。以下资料由英国NVIDIA公司的开发工程师Mark Harris提供。
可编程并行处理器:GPU有两类可编程处理器,即三角顶处理器和像素处理器。顶点处理器负责处理顶点数据流(由位置、颜色、标准向量和其它属性),它们是组成三维几何模型的元素。依据每个顶点相对于其视点的位置,顶点处理器用顶点渐变程序对其转换。
像素处理器将像素渐变程序用于处理每个输出像素以确定其最后的颜色。顶点处理器和像素处理器是完全可编程的,可以对四个不同的数值同时执行一条指令。这是因为图形的基本要素或者是位置(X、Y、Z、W)或者是颜色(红、绿、蓝、alpha)。
ATI最为喜欢的SIMD结构流处理器
光栅处理器:在顶点处理器转换完顶点之后,每三个一组的顶点就用来计算一个三角形。从这个三角形出发,光栅处理器生成一个像素流。该光栅处理器的功能非常专一,就是表现这些三角形,因而不是用户可编程的,但可将它看成是一个地址内插器和一个数据放大器(因为它根据几个三角顶就可生成许多像素)。
纹理单元:顶点处理器和像素处理器能以纹理(图像)的形式访问存储器。该纹理单元可被看成是一个只读存储器接口。当前的GPU可以将一个输出图像写到纹理结构存储器,而不是写到帧缓存器。这个纹理渲染功能是基本的,因为它是将GPU输出直接反馈到输入的唯一现有机制,这个过程无须返回到宿主处理器。纹理渲染可被看成是一个只写存储器接口。
本次Fermi架构显卡所使用的CUDA运算核心
数据类型:当涉及数据类型时,现有的GPU比CPU更受限制。它们只支持定点或浮点形式的实数。如果没有一些图形编程方面的知识,初涉GPU编程可能会感觉麻烦。在CPU和GPU之间做某些非常简单的类比是有益的。
GPU纹理 = CPU矩阵:GPU上的基本矩阵数据结构是纹理(图像)和顶点矩阵。在CPU上用到一个数据矩阵的地方,也就是在GPU上用到一个纹理的地方。
GPU渐变程序 = CPU内循环:在CPU中,一个循环可重复用于一个数据流(存在一个矩阵内)内的各个元素,用该循环体内的各条指令处理这些元素。在GPU中,类似的指令可写在一个渐变程序之内,并自动应用到相应数据流的所有元素上。在这个计算中并行处理的数量取决于该GPU中处理器的数量。
纹理渲染 = 反馈:为了在GPU中实现反馈,纹理渲染功能必须用来将一个碎片程序的结果写到存储器中,该存储器随后可用做未来其它程序的输入。
几何光栅 = 计算启动:为了启动GPU中的计算,只需画个简单的几何图形。顶点处理器将转换它,而光栅单元将决定它所涉及的输出缓存器中的像素值,并为每个元素产生一个碎片。由于表示一个矩阵的方形碎片流中的每个元素一般都要经过处理,因此在GPU编程中启动通用计算最常见的手段就是用一个方块。
分支对GPU结构体系的挑战
● 分支对GPU结构体系的挑战
分支和循环是最基本的流程控制,也是编程中最基本的概念。我们知道CPU是为单线程程序运行加速而设计的,GPU是为并行程序设计的。首先CPU是指令并行,只有指令间并行的架构才需要分支预测,而GPU是线程间并行,指令按顺序发射,没有分支预测。所以当GPU遇到分支问题时,性能会发生较大的变化,而且不同架构的性能变化幅度也不一样。
GPU起初是为了3D渲染设计的,涉及到大量同类型平行数据计算,数据吞吐量很大,因此GPU内部包含了大量的核心(抑或叫处理单元)以满足这种需求;相反的,CPU设计侧重于通用应用,其中很大一部分晶体管用于逻辑控制单元和缓存,适用于繁琐的计算。例如CPU控制单元可以分支预测,推测执行,多重嵌套分支执行(if条件判断等等),而GPU计算的时候则将数据全部扔进着色器核心运算输出,GPU内没有流水线,因此无法实现乱序执行等技术,同时GPU的分支能力是靠线程挂起来实现的,换而言之是频繁的线程切换把分支延迟都给掩盖了。
让我们通过一段简单的程序来了解分支的概念:
If (a)
b=f()
else
b=g()
一个典型的条件分支程序示意图
CPU可以容易地基于布尔变量a来求f()或g()函数。这种分支的性能特征相对容易理解:CPU内有相对较长的流水线和专门的功能单元,因此CPU能够正确地预测是否会采用一个特定的分支。如果这个预测能够成功地完成,通常分支会导致较小的损失。
而GPU没有这种功能单元,但是也可以进行分支运算的操作,而且分支在遇到不同结构的流处理器体系时表现的性能也是有很大差异的。在单指令多数据流(SIMD)的结构中,单一控制部件向每条流水线分派指令,同样的指令被所有处理部件同时执行。另外一种控制结构是多指令多数据流(MIMD),每条流水线都能够独立于其他流水线执行不同的程序。
从GeForce 6800 Ultra开始,NVIDIA公司GPU内部的顶点着色器流水线使用MIMD方式控制,像素着色器流水线使用SIMD结构,而AMD则一直全部使用SIMD结构。MIMD能比较有效率地执行分支程序,而SIMD体系结构运行条件语句时会造成很低的资源利用率。不过SIMD需要硬件少,可以大量添加运算单元,这是一个优势。
GPU可以通过线程分配器+各种临时资源的挂起能力来完成动态的线程分配,一旦某线程当前无法完成就把它挂起而不用等着,等它可以被完成了再送去其他单元进行处理,这是周边资源充足之后可以很轻松实现的东西。GPU内部的每个处理单元都不会闲着,处理不来马上换下一个线程,但这不是标准的乱序执行。乱序要和流水线衔接的,使流水线没有空闲是其目的。GPU中每个SP都是一个1级流水线的东西,流水线只能满载。所以CPU的乱序执行技术是流水线防欠载的手段,而GPU则是处理单元防欠载。这种宏观上的动态的线程分配和挂起能力决定了GPU可以利用计算来掩盖存储进行分支操作。
GPU与CPU将如何演绎融合与吞并
● GPU与CPU将如何演绎融合与吞并
通用处理器(CPU)经过几十年发展,Intel、AMD脚步越来越慢,处理器性能提升越来越小。反观GPU潜力无限,性能提升空间巨大。CPU着重于通用运算,而GPU则对矩阵和并行运算更加在行,若是将这两者整合起来必定会带来处理器发展的新纪元。
就一般通用处理器来说,在大规模并行处理方面性能远不如GPU。我们可以通过让GPU运行并行度高计算密集的程序,将GPU的优势发挥出来,使其性能得到大幅提高。从更深层次考虑,目前CPU性能提升遇到了各种各样的困难,除了难以攀升的核心频率之外,核心架构效率、核心数量都很难获得大幅提升。反观GPU就是一番不同的景象了,它的潜力还未被完全的挖掘,提升空间巨大。
在这一部分我们着重分析3款跨时代的并行计算产品的特性和发展状况,而下一章节我们会深入分析其架构特点。
首先要登场的是Larrabee芯片,这是一款由多个小型X86内核组成的并行计算处理器。它最早于2007年的秋季IDF提出,是Intel在X86架构与GPU类向量处理器架构之间做出精确衡量的产品。它的主要技术特色有X86架构核心、顺序执行单元和多核心技术与CSI总线等几大看点。Larrabee因为其可编程性优越,而特别被市场和用户所关注。
Intel对于未来计算趋势的认识
Intel使用CPU经典原理和最新技术改良了传统GPU,使其集成了数目可观的X86核心,并采用顺序执行,同时辅以先进的CSI总线和高速存储系统,形成了Larrabee芯片概念。Larrabee芯片隶属于Tera-Scale项目,是一块融入的诸多先进技术的GPU。对于图形工业而言,Larrabee是一款具有革命意义的产品,它与常规的意义上的GPU存在理念上的差异,即Larrabee将通用计算性能放在优先位置。Intel高级副总裁Pat Gelsinger表示,Larrabee是一种可编程的多核心架构,采用顺序执行架构(CPU为乱序执行核架构),并使用经过调整的x86指令集,在运算性能上将达到万亿次浮点运算的级别。
相对于传统领域,Fusion则是我们更关注的。早期的GPU是用类似OpenGL或Cg的图形API编程的,这些API很难且大多数开发人员也不熟悉。另外,由于GPU内部缓存远远小于CPU,它只能执行预定好的任务,并不能像CPU那样去执行自定义的任务。这个状况在NVIDIA和AMD的新产品上发生了很大转变,但GPU还是不能染指CPU的领域。基于这个原因,AMD认为NVIDIA不会马上成功,Intel在没有高端图形芯片时也不能威胁到自己,但面对未来应用,必须将CPU与GPU紧密结合,各取所长。
2005年10月25日,在AMD收购ATI后,随即发表代号为Fusion(融合)的研发计划,Fusion预计将AMD的CPU与ATI的GPU整合在一起,同时也将北桥芯片也一并纳入。初期的Fusion将简单整合CPU与GPU到一个芯片中,最终产品CPU和GPU将彻底融合,互相使用其物理资源构成强大而特殊的逻辑芯片成为APU(Accelerated Processing Unit)。
NVIDIA同样对并行计算市场充满期待并且在实践着自己的计划,今年推出的Fermi架构处理器就是其战略目标的重要一步。Fermi的众多特性,已经明明白白告诉用户,这不是仅为游戏或者图形运算设计的GPU,而是面向图形和通用计算综合考虑的成果。全局ECC设计、可读写缓存、更大的shared memory、甚至出现了分支预测概念……这次Fermi抛弃长期使用的“流处理器”称谓方式,更明确体现了NVIDIA的意图。
代号GF100的Fermi设计方案在4年前确定下来并付诸行动,这时正值代号G80的Geforce 8800GTX做最后的出厂准备。G80凭借全新的MIMD(多指令流多数据流)统一着色器(又称流处理器)获得了业界的一致认同,同时被业界关注的还有G80的通用计算性能。NVIDIA的Tony Tamasi先生(NVIDIA高级副总裁,产品与技术总监)表示:“以前的G80架构是非常出色的图形处器。但Fermi则是一款图形处理同样出色的并行处理器。”从SIGGRAPH 2003大会首先提出GPU通用计算概念,到NVIDIA公司2007年推出CUDA平台,再到今天Fermi架构面向通用计算领域设计。越来越多的信号告诉我们,GPU通用计算是一片正在被打开的潜力巨大的市场。
第四章:GPU内部计算实现细节
● 第四章:GPU内部计算实现细节
从并行计算演变的角度来看,伴随着PC级微机的崛起和普及,多年来计算机图形的大部分应用发生了从工作站向微机的大转移,这种转移甚至发生在像虚拟现实、计算机仿真这样的实时(中、小规模)应用中。这一切的发生从很大程度上源自于图形处理硬件的发展和革新。近年来,随着图形处理器(GPU)性能的大幅度提高以及可编程特性的发展,人们首先开始将图形流水线的某些处理阶段以及某些图形算法从CPU向GPU转移。
除了计算机图形学本身的应用,涉及到其他领域的计算,以至于通用计算近2~3年来成为GPU 的应用之一,并成为研究热点。GPU内部有众多参与图形计算的功能单元,正如我们在前文中看到的,其中大多数浮点单元由于具备可编程性而成为通用计算单元。在本章,我们将分析当前最受关注的几种GPU架构和这些架构中的晶体管分配差异和整数与浮点运算的实现情况。
单核心CPU,多核心CPU与异构计算发展阶段
在SIGGRAPH 2003大会上,许多业界泰斗级人物发表了关于利用GPU进行各种运算的设想和实验模型。SIGGRAPH会议还特地安排了时间进行GPGPU的研讨交流。与此同时,DirectX 9 Shader Model 3.0时代,新的Shader Model在指令槽、流控制方面的显著增强使得对应GPU的可编程性能得到了大大的提升。GPGPU的研究由此进入快车道。2003年被认为是图形硬件被用来做通用计算的一个里程碑。大多数文献也认为GPU在2003年已经进入计算的主流.采用图形硬件来做通用计算的主要目的是为了加速,加速的动力来自这些新硬件所具有的以下主要优势:
(1)一定的并行性:这一功能主要是通过多个渲染管道和RGBA 4个颜色通道同时计算来体现的,另外在一个时钟周期内可以同时获取2个甚至更多副纹理.顶点程序的多个渲染管道意味着一个时钟周期可以并行处理多个顶点,而对于像素程序同样如此.相对于并行机而言,图形卡提供的并行性虽然很弱,但它在十分廉价的基础上为很多应用提供了一个很好的并行方案,尤其是对于图形本身的应用来说。
(2)高密集的运算:由于图形卡内部的内存接口位宽大于CPU上的位宽,如Radeon HD2900XT的内存位宽达512位,显然高于CPU上64或者双通道128位的位宽,这样整个计算的带宽大大提高.GPU相对于CPU来说,更适应传输大块的数据,虽然CPU上有Cache可以加速整个计算过程,但CPU上的Cache相对于图形卡显存来说太小,一般只有6MB左右,而现在的显存大多都在1024MB以上,最新的GPU中同样出现了768KB可读写缓存,由此可见一斑。
(3)减少了GPU与CPU的数据通信:尤其是当整个应用针对图形生成的时候,不再需要在CPU与GPU之间进行多次数据交换,从而可以将CPU解放出来做其他的事情.这些优势使得GPU 比CPU更适用于流处理计算,因此GPU也被认为是一个SIMD的并行机或者流处理器,可以用于处理大规模数据集,使得应用得到加速。相比之下,CPU本质上是一个标量计算模型,而计算单元偏少,主要针对复杂控制和低延迟而非高带宽进行了若干优化。
现阶段我们看到了从R600到R800时代,ATI历经3年时间通过不断改进架构(放大规模与优化内部结构并重),获得了前所未有的浮点吞吐性能和业界最高的性能功耗比。同时我们通过NVIDIA设计的Fermi架构已经看到了GPU并行计算继续向前向更深入的领域发展,虽然第一代GF100核心由于受到了现阶段半导体工艺的限制并不十分完美,但是第二代GF104核心表现出色。
Intel也抓紧一分一秒来推进自己的并行计算产品,几天前Intel对外发布了一款名为“Knights Ferry”的服务器处理器。该处理器使用了Intel当前最先进的32nm工艺技术,拥有数量庞大的32颗核心,主频也已经达到了较高的1.2GHz。据Intel总裁兼数据中心群组总经理Kirk Skaugen表示,“Knights Ferry”是目前Intel推出的最快处理器。通过我们对这款产品的分析得知,“Knights Ferry”正是就是束之高阁的Larrabee。
GPU主要计算单元分布和职能
● GPU主要计算单元分布和职能
为了把通用的计算映射在GPU的专用硬件上,我们应该首先熟悉GPU所提供的运算资源。在统一渲染架构提出之前,GPU内部有两种可编程处理器,分别是顶点处理器和像素处理器,在图形运算中我们将它们称为Pixel Shader(像素着色器)、Vertex Shader(顶点着色器)。由于目前ATI R600到R800架构一直在使用Pixel Shader(像素着色器)所代表的SIMD结构流处理器,而NVIDIA G80到GF100一直在使用Vertex Shader(顶点着色器)所代表的MIMD结构流处理器,所以我们借助一些图片来为大家拆分GPU着色器单元的原理。
顶点处理器处理顶点流(由位置、颜色、法线向量和其他属性组成),这是组成多边形几何模型的元素。计算机图形一般用三角形网格来表示3D物体。顶点处理器应用一个顶点程序(也可以称为顶点着色器)根据相对摄像机的位置来转换每个顶点,然后每组3个顶点用来计算一个三角形,由此产生了片段流。
顶点如何表示三角形图元
可以认为片段是“原始像素”,它包含的信息用来在最终图形中产生一个着色的像素,包括颜色、深度和在显存区内的目的地。像素处理器将一个片段处理器(也可以称作像素着色器)应用到流中的每个片段,用来计算每个像素的最终颜色。
1、传统意义中的顶点处理器(MIMD结构)
由于图形运算具备较高的并行度,所以GPU内部都有多个顶点处理器。这些处理器是完全可编程的,而且ATI和NVIDIA都选择了以MIMD并行的方式操作输入顶点。3D计算机图形基本图元是投射空间中的3D顶点,表示为一个四元组(x,y,z,w)的向量,四维的颜色存储为四元组(red,green,blue,alpha)的向量(通常缩写为R,G,B,A),其中Alpha一般表示透明的百分比。
2、传统意义中的像素处理器(SIMD结构)
和顶点处理器一样,GPU中也包含大量并行的像素处理器,这些处理器也是完全可编程的。像素处理器以SIMD的并行形式操作输入元素,并行地处理四维向量。像素处理器有能力获取来自纹理的数据,因此它们可以进行聚集。但是像素输出地址总是在像素处理之前,也就是说处理器不能改变像素的输出位置。因此像素处理器不能进行散布。
这里所说的聚集(Gather)和散布(Scatter)是讨论在GPU上进行数据通信时提出的概念,它们是GPU两种主要的通信类型。聚集发生在当处理一个流元素时还需要其他流元素的信息,它聚集来自存储器其他部分的信息。另一方面散布发生在当处理一个流元素的时候把信息信息分布到其他流元素,它把信息“散布”到存储器的其他部分。
现代GPU通用计算程序中,适应于SIMD结构流处理器的程序比MIMD结构要多,因此这种结构可以有效处理吞吐需求较量大的并行度较高的数据类型,但是一旦遇到分支等因素的影响,MIMD的衰减要明显小于SIMD结构,所以MIMD结构可以更好地使用复杂数据与指令结构。
3、光栅器与纹理单元
在顶点处理器转换顶点之后,每组3个顶点都用于计算一个三角形,从这个三角形产生一个片段的流。产生片段的工作由光栅器(ROP单元)完成,光栅器可以认为是一个地址插值器或者是一个数据放大器。光栅器的这些功能专用于渲染三角形,而且用户是不可编程的。
像素处理器(TMU单元,由Texture Address 和Texture Filtering组成。翻译为:纹理定址单元和纹理拾取单元)可以以纹理的形式访问存储器。我们可以把纹理单元想象成一个只读的存储器接口,存储器读和写在GPU上是完全分开的。
GPU内部通用计算代码运算过程
● GPU内部通用计算代码运算过程
CPU与GPU在编程方面到底有哪些联系和区别,如何将原有CPU编程概念和GPU硬件概念相对应?相信这对于一位对GPU并不十分了解的程序员还是相当困难的,这一节我们通过对应传统的CPU计算概念和他们对应的GPU概念上做一些非常简单的类比来帮助用户理解这一点。
GPU纹理=CPU数组:在GPU上的基本数据数组结构是纹理和顶点数组。对于GPGPU来说,SIMD结构的流处理器比MIMD结构流处理器更为易用同时拥有更高分值。在任何会在CPU上使用数据数组的地方,都能在GPU上使用纹理。
GPU片段程序=CPU“内循环”:GPU的很多并行流处理器是它们的计算部件——它们在数据流上执行核计算。在CPU上,会使用一个循环来迭代流的元素,串行序列化地处理它们。在CPU的情况中循环内的指令是核。而在GPU上,在一个片段程序中写相似的指令,它们会被应用到流的所有元素。在这个计算过程中,并行数量取决于使用的GPU上有多少个流处理器,以及是否能够很好地利用GPU计算指令提供的四维向量结构的指令并行性。
渲染到纹理=反馈:大多数计算在GPU内部被拆解为很多步,每一步都依赖前一步的输出。在CPU上这些反馈都是微不足道的,因为它的存储器模型是统一的,它的存储器可以在程序中的任何地方被读或者写。而GPU为了反馈,必须使用渲染到纹理这个过程,把片段程序的结果写入存储器,然后才可以把后面的程序输入。
几何体光栅化=计算调用:为了执行一个程序,还应该知道该如何计算,而不止是数据表示、计算和反馈。为了计算调用,只需要绘制几何体。顶点处理器将会转换几何体,而光栅器将会决定它在输出缓冲区中覆盖了哪些像素,并为每一个像素产生一个片段。在GPGPU中,一般处理片段的矩形流中的每个元素,他们表现成一个栅格。因此在GPGPU中编程最常见的一个调用是一个四边形。
在绘制图像时,GPU首先接收宿主系统以三角顶点形式发送的几何数据。这些顶点数据由一个可编程的顶点处理器进行处理,该处理器可以完成几何变换、亮度计算等任何三角形计算。接下来,这些三角形由一个固定功能的光栅器转换成显示在屏幕上的单独“碎片(fragment)”。在屏幕显示之前,每个碎片都通过一个可编程的碎片处理器计算最终颜色值。
计算碎片颜色的运算一般包括集合向量数学操作以及从“纹理”中提取存储数据,“纹理”是一种存储表面材料颜色的位图。最终绘制的场景可以显示在输出设备上,或是从GPU的存储器重新复制到宿主处理器中。
两向量相加的简单Brook代码示例
图为执行两向量相加的简单Brook代码示例。Brook支持所有带附加流数据的C句法,流数据存储于GPU的存储器中,而核函数也在GPU上执行。可编程顶点处理器和碎片处理器提供了许多相同的功能和指令集。但是,大部分GPU编程人员只将碎片处理器用于通用计算任务,因为它通常提供更优的性能,而且可以直接输出到存储器。
利用碎片处理器进行计算的一个简单例子是对两个向量进行相加。首先,我们发布一个大三角形,其所包含的碎片数量和向量大小(容纳的元素)相同。产生的碎片通过碎片处理器进行处理,处理器以单指令多数据(SIMD)的并行方式执行代码。进行向量相加的代码从存储器中提取两个待加元素,并根据碎片的位置进行向量相加,同时为结果分配输出颜色。输出存储器保存了向量和,这个值在下一步计算中可以被任意使用。
可编程碎片处理器的ISA类似于DSP或Pentium SSE的指令集,由四路SIMD指令和寄存器组成。这些指令包括标准数学运算、存储器提取指令和几个专用图形指令。
认识GPU浮点计算精度
● 认识GPU浮点计算精度
DirectX 9.0时代提出的Shader Model 2.0最重要的一点改进是增加对浮点数据的处理功能,以前GPU只能对整数进行处理,改进后提高渲染精度,使最终处理的色彩格式达到电影级别。Shader Model 2.0时代突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。而从通用性方面理解,支持浮点运算让GPU已经具备了通用计算的基础,这一点是至关重要的。
如果说DirectX 8中的Shader单元还是个简单尝试的话,DirectX 9中的Shader则成为了标准配置。除了版本升级到2.0外,DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消,在较低DirectX版本游戏运行时会使用VS单元模拟执行硬件T&L单元的功能。
浮点处理器能够统一执行多种任务
后来统一渲染架构提出进一步提高了着色器的运算效率,Pixel Shader(像素着色器)、Vertex Shader(顶点着色器)和Geometry Shader(几何着色器),三种具体的硬件逻辑被整合为一个全功能的着色器Shader。程序员不必为了两种结构不同的着色器分别编写程序,GPU内部的可编程单元被抽象为浮点处理器(Floating Point Processor)。
一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。关于浮点数表示法,我们可以通过看下面的表达式来理解:
Sign×1.matissa×2(exponent-bias)
我们可以将其套用在数143.5的表示上,这对应科学计数法的1.435×102。科学计数法的二进制表示是1.00011111×2111。因此底数被设为00011111(前导的1被省略),将指数偏移127来存储(由特定的浮点格式标准设置),也就是10000110。
不同的浮点格式用不同的位数来表示底数和指数,例如IEEE754标准中,一个32位单精度浮点数有一个符号位、一个8位的指数和一个23位的底数。底数和指数占有的位数决定了我们可以多精确的表示一个数字。对于143.5用IEEE754可以精确表示,但是如果浮点位数过多如143.98375329,就只能被取到143.98375,因为底数只占23位。
今天的GPU已经能够表示IEEE754标准提出的单精度32位和双精度64位浮点数。IEEE单精度格式具有24位有效数字,并总共占用32位。IEEE双精度格式具有53位有效数字精度,并总共占用64位。在这里基本浮点格式是固定格式,相对应的十进制有效数字分别为7位和17位。基本浮点格式对应的C/C++类型为float和double。
但是在以前,确切说是DirectX 9.0时代伊始,GPU还是要通过一代一代的改进才能表示更精确的浮点数。在R420和NV40竞争的时代,在速度和画质选择上,ATI选择了延续FP24+SM2.0的DirectX解决方案,而NVIDIA选择了经历过NV30尝试后成熟的FP32+SM3.0的解决方案。所以我们可以通过当时的GPU硬件浮点精度来看他们表示数字的实际效果,在这里我们还是表达143.98375329:
浮点格式 |
结果 |
误差 |
NVIDIA FP16 |
143.875 |
0.10875329(7×10-2%) |
ATI FP24 |
143.98242 |
0.00133329(9×10-4%) |
NVIDIA ATI PF32 |
143.98375 |
0.00000329(2×10-6%) |
虽然在图形运算中32位单精度甚至是16位半精度已经完全足够使用,但是在面向通用计算设计的GPU中,由于需要的数据量巨大,往往只有在采用双精度甚至更高精度时才能获得可靠的结果,所以更为可靠的计算精度一直是GPU设计者不断追求的目标。但是精度提高意味着运算速度的下降,所以每一代GPU架构更新都意味着更大的寄存器和内部实现方式在高精度运算中能够获得更好的加速比。
整数运算能力与未来融合架构
● 整数运算能力与未来融合架构
在图形运算中,整数单元可以用来处理整数纹理过滤。纹理过滤包括两部分,一是抗失真,二是抗溢出。CPU一开始不会浮点运算,过去的CPU寄存器资源全部都是给整数单元。但是在整数运算方面,目前INT单元在通用计算中的效用不是非常明显,首先科学运算中涉及整数的场合本身就远没有浮点多,其次在这个基础上,CPU的整数一直都是很传统的保留项目。
整数单元的构成并不是GPU的性能瓶颈,但是在GPU的运算性能中,整数能力也是非常重要的环节,如果设计者忽视了这一点,将在通用计算中给GPU带来严重性能短板。比如说在穷举算法为主的密码学中几乎没有浮点密码,整数运算能力直接影响到GPU的运算效率。
OpenCL和DirectCompute两大API的推出让GPU并行计算的前途豁然开朗,此时ATI和NVIDIA在接口标准方面又重新站在了同一起跑线上。那么很显然AMD在目前GPU通用计算不能单独和NVIDIA抗衡的情况下,所选择的战略是借助于全新的API使得CPU强化整数GPU接管浮点。
Bulldozer核心架构
AMD同时拥有CPU和GPU,而且NVIDIA和Intel都没有同时驾驭这两种差异度极高的产品线的能力,因此其未来发展规划非常值得大家思考。其下一代的高端CPU核心Bulldozer(推土机)最大的亮点就是每一颗核心拥有双倍的整数运算单元,每个单元4条并行流水线,整数和浮点为非对称设计。Bulldozer还将加入128-bit的SSE5指令集支持,达到更高的执行效率,估计还将会增加CPU寄存器数量,为单指令多数据流技术(SIMD)运算提供更多的空间。
这种设计使得浮点计算的重任开始向GPU倾斜,未来的CPU将专注整数运算能力,而如果用户需要大量的并行浮点计算,可以选择使用外置的加速卡(GPU通用计算产品)来实现。
在一个推土模块里面有两个独立的整数核心,每一个都拥有自己的指令、数据缓存,也就是scheduling/reordering逻辑单元。而且这两个整数单元的中的任何一个的吞吐能力都要强于Phenom II上现有的整数处理单元。Intel的Core构架无论整数或者浮点,都采用了统一的scheduler(调度)派发指令。而AMD的构架使用独立的整数和浮点scheduler。
AMD认为CPU和GPU谁也不可能取代谁,双方是互补的关系,只有CPU和GPU协同运算,各自去处理最擅长的任务,才能发挥出计算机最强的效能。从CPU漫长的发展历程来看,它会延续一路不断整合其他功能单元的道路来整合GPU,但仅限中低端产品,而且这种整合不是吞并,而是提高CPU的浮点运算性能;GPU会取代CPU进行浮点运算,但它仍然需要CPU来运行操作系统并控制整个计算机。
实际上自从2006年收购ATI以后,AMD便开始将更多精力放在一些特殊功能的电路元件上,尤其是图形处理技术。这是以前ATI的主业,ATI从R520架构开始提供的视频编码和解码技术非常出色。AMD很快在该部门中使用了所谓的“异构计算”(heterogeneous computing)技术。联系到AMD在8月16日推出全面支持OpenCL 1.1 的 ATI Stream软件开发包 (SDK) 2.2版,借助正在执行的Fusion的战略,AMD明年将首次在单芯片中实现异构计算技术。
GPU存储体系特点与变化
● GPU存储体系特点与变化
GPU存储体系是GPU的显著优势,当然从某一方面讲也是GPU的明显劣势。其优势是可以借助显卡PCB上焊接的GDDR3或者GDDR5显存,加上GPU内部充足的显存控制器资源获得CPU无法比拟的带宽,劣势是GPU没有足够大的Cache,并且存储体系构成与管理方式相对于CPU来说还是过于简单。
相对于串行CPU的主存储器、Cache和寄存器,图形处理器具有他们自己的存储体系结构。然而,这个存储器体系结构是针对图形加速操作设计的,适合于流式编程模型,而不是通用串行的计算。而且图形API进一步将这个存储器限制成为只能使用图形专用的图元、如顶点、纹理和显存。
CPU与GPU存储体系简析
上图演示了简单的CPU和GPU存储体系结构。GPU的存储器系统建立了现代计算机存储体系的一个分支。GPU和CPU类似,它也有自己的Cache和寄存器来加速计算中的数据访问。然而GPU自己的主存储器也有它自己的存储器空间——这意味着在程序运行之前,程序员必须明确地把数据复制写入GPU存储器。这个传输传统上是很多应用程序的一个瓶颈,但是新的PCI-Express总线标准可能使存储器在CPU和GPU之间共享数据在不远的未来变得更为可行。
具体到显存带宽方面,当前桌面级顶级产品3通道DDR3-1333的峰值是32GB/s,实测中由于诸多因素带宽在20GB/s上下浮动。HD 5870 1024MB使用了8bit预取位带宽超高的GDDR5显存,内存总线数据传输率为150GB/s的总线带宽。而主流GPU普遍拥有40-60 GB/s显存带宽。存储器的超高带宽让巨大的浮点运算能力得以稳定吞吐,也为数据密集型任务的高效运行提供了保障。
在Cache方面,为了适应更复杂的数据,在GPU内部加入Cache是一种有效的方式:最近使用的数据的副本可以由存储器传递到Cache中并根据替换协议不断更改。但是Cache由于对晶体管消耗较大,缓存协议难以实现,延迟难以控制,一直是GPU设计的重要障碍之一。
又如NVIDIA在G80架构中加入的Shared Memory和AMD在RV770架构加入的LDS(Local Data Share)。这个共享寄存器位于每个流处理器单元内部的所有运算单元中,它在通用计算时负责共享数据和临时挂起线程。容量足够大的共享缓存可以在运算时提高线程的挂起能力,还有很多东西比如乱序,分支等等都会受益于Cache的加入。
ATI GPU吞吐特性对比与分析
● ATI GPU吞吐特性对比与分析
我们知道ATI现有的R800架构是由R600架构演变而来的,而R600又可以看作是支持DirectX10的Xenos处理器,同时Xenos最大的特色是采用了统一着色器单元架构,这是当时最为先进的GPU架构,所以现在的R800架构还是充满了浓重的传统渲染流处理器色彩,这种沿用至今的SIMD单元同一时间内执行一个线程,各SIMD单元都有自己的寄存器供SIMD内的执行单元共享。
AMD从R600时代开始,其SIMD核心内的5D ALU采用VLIW技术,可以用一条指令完成对多个对数据的计算。图形Shader指令经过驱动的JIT(即时)编译器编译优化后,变成GPU能识别的机器码并被捆绑成长度数百位元的VLIW指令串包。VLIW指令包到达指令序列器后,会被动态重新安排,序列器会把不相依的指令捆绑成能够尽可能让SIMD单元并行执行的指令串,交给SIMD单元执行。
VLIW的效率依赖于指令系统和编译器的效率。如果指令并行度较高,则这种流处理器组织结构会受益。如果并行度较差,编译器必须尽可能地寻找指令中的并行性并将其并接为合适的长指令,这样5D ALU中的计算单元就会尽可能地被利用起来不至于浪费。虽然NVIDIA的1D ALU不会遇到这种问题,但是1D ALU最大的问题就是调度器和发射端包括寄存器的晶体管消耗量太严重,理论浮点吞吐量无法获得提升。
开放性通用计算接口OPEN CL
关于A卡和N卡在开放性的通用计算接口OPEN CL计算方面的性能差异,很多媒体进行过测试,但大家实际上一直在找一个合适的平台,在找一套合适的测试基准程序。目前,首款国人开发的支持GPU的OpenCL通用计算测试程序OpenCL General Purpose Computing Benchmark (简称GPC Benchmark OCL)已经公开并且升级到1.1版本。中关村在线显卡频道决定使用这款软件,对AMD和NVIDIA的架构特性做一些对比,以测试它们在哪些环境中能发挥出更好的理论性能。
我们使用GPC Benchmark 1.1对当前ATI和NVIDIA顶级GPU做理论浮点运算能力测试,测试选择了最具代表性的浮点吞吐项目,分别是单精度加法、单精度乘法、单精度乘加、密码学SHA-1哈希加密。我们选择了10.3正式版驱动(AMD Radeon HD 5870)和256正式版驱动(NVIDIA GeForce GTX 480)测试平台如下:
测 试 平 台 硬 件 | |
中央处理器 | Intel Core i7-870 |
散热器 | Thermalright Ultra-120 eXtreme |
内存模组 | G.SKILL F3-12800CL9T-6GBNQ 2GB*2 |
(SPD:1600 9-9-9-24-2T) | |
主板 | ASUS P6T Deluxe |
(Intel P55 + ICH10R Chipset) | |
显示卡 | |
测 试 产 品 | |
GeForce GTX 480 | |
(GF100 / 1536MB / 核心:700MHz / Shader:1401MHz / 显存:3696MHz) | |
Radeon HD 5870 | |
(RV870 / 1024MB / 核心:850MHz / Shader:850MHz / 显存:4800MHz) | |
GeForce GTX 285 | |
(GT200 / 1024MB / 核心:648MHz / Shader:1476MHz / 显存:2848MHz) | |
Radeon HD 4870 | |
(RV770 / 1024MB / 核心:780MHz / Shader:780MHz / 显存:3700MHz) | |
硬盘 | Western Digital Caviar Blue |
(640GB / 7200RPM / 16M | |
电源供应器 | AcBel R8 ATX-700CA-AB8FB |
(ATX12V 2.0 / 700W) | |
显示器 | DELL UltraSharp 3008WFP |
(30英寸LCD / 2560*1600分辨率) |
除了底层性能的检测软件之外,我们还使用了SiSoftware Sandra 2010版软件来检测显卡所搭载的GPU理论浮点吞吐量。这个测试可以检测GPU的Shader单元运算能力,虽然它是面向通用计算程序设计的,但是在一些较为高端的对Shader负载较重的游戏中,Shader单元运算能力强的显卡可以有更强劲的发挥和更小的性能衰减。
SiSoftware Sandra 2010 GPGPU Processing项目浮点吞吐
需要注意的是这里检测的仅是理论浮点值,实际运算环境中将会包含大量跳转嵌套分支等指令,只有运算器组织得当的GPU,才能有效避免理论值的大幅度衰减。测试对N卡和A卡则给予了可选择的接口支持,所以测试结果无论是对于NVIDIA还是AMD都比较公正。我们使用的版本号是16.36.2010,测试方法是进入程序后,选择界面中的Benchmark工具,然后选择GPGPU Processing项目。
ATI GPU OPEN CL综合性能分析
● ATI GPU OPEN CL综合性能分析
上一节我们使用两种软件考察了ATI GPU的吞吐特性,这个测试结果佐证了我们之前对于ATI GPU架构的相关分析,接下来我们将通过OpenCL通用计算测试程序OpenCL General Purpose Computing Benchmark (简称GPC Benchmark OCL)1.1版本全部项目来测试NVIDIA和ATI顶级单卡单芯性能,我们选择了10.3正式版驱动(AMD Radeon HD 5870)和256正式版驱动(NVIDIA GeForce GTX 480)。
在测试之前有必要对本次测试项目做简单介绍:首款国人开发的支持GPU的OpenCL通用计算测试程序OpenCL General Purpose Computing Benchmark (简称GPCBenchMarkOCL)是由国内几名高性能计算从业人员和爱好者合作编写的,目的是为了评估在不同的OpenCL平台上一些基本算法和应用的性能。与目前流行的一些OpenCL、DirectCompute通用计算测试程序的不同在于,目前这些测试程序测试项目过于单一,基本上就是某一两种算法的性能测试,甚至干脆就是理论峰值计算性能的测试。
而实际上,OpenCL计算设备包括GPU的计算性能是受非常多因素影响的,除了计算单元的频率和数量之外,还有计算单元架构、Global memory(显存)带宽、Local memory(GPU内的片上存储器,NVIDIA称为Shared memory,AMD称为Local Data Share)带宽和Bank conflict、存储器合并访问情况、存储器同步成本、缓存等各种因素。因此某些纸面计算性能非常高的GPU执行某些计算时性能却不一定好;又或者,某GPU在执行某种计算时虽然性能落后于另一架构的GPU,但是在执行另一种计算时性能反而超前。GPCBenchMarkOCL集合了高性能计算领域多种常见的基础算法和应用,能比较全面地评估GPU及其它OpenCL计算设备在通用计算应用中的性能。
GPCBenchMarkOCL软件界面
目前GPCBenchMarkOCL的测试项目包括:
1、Global Memory带宽(读、写、拷贝以及PCI-E总线带宽) - 主要考察不同传输尺寸下各种访存操作的性能
2、Local Memory带宽(带宽和Bank conflict) - 分析Local memory带宽与数据类型、Bank conflict的关系
3、32位整数性能(加法、乘法、乘加和位运算) - 分析处理器32位整数处理性能
4、单精度浮点性能(加法、乘法、乘加和特殊函数如sqrt、sin等) - 分析处理器单精度浮点数处理性能
5、双精度浮点性能(加法、乘法、乘加和特殊函数如sqrt、sin等) - 分析处理器双精度浮点数处理性能
6、常用计算(单精度和双精度浮点的大矩阵乘法、大矩阵转置、归约、DCT8x8) - 分析处理器在进行一些常用矩阵与信号处理运算中的表现
7、图像处理(亮度直方图、2维卷积、降噪、双立方插值缩放) - 分析处理器在进行一些常用图像处理中的表现
8、密码学(目前只有SHA-1 Hash Loop,以后将加入盒型加密和彩虹表) - 分析处理器在密码学应用中的性能。
在GPCBenchMarkOCL中,所有测试都会在CPU和GPU(包括其它OpenCL设备)上运行并给出性能结果,不过CPU上运行的并非OpenCL代码而是用常规C语言实现的并行算法(会调度全部的CPU核)。而GPU上运行的OpenCL代码经过试验能正确运行在NVIDIA GTX285和AMD HD5870上。各算法的OpenCL实现有部分修改自NVIDIA和AMD的SDK,部分是由相关从业人员和爱好者提供的。
由于NVIDIA和AMD的GPU架构上有很大区别,对于某些算法也许能专门针对NVIDIA或AMD的GPU架构写出非常难看的比较极端优化的OpenCL代码,但考虑编程难度、程序的可读性和普遍意义,GPCBenchMarkOCL只使用了一般的GPU编程优化方法做了简单优化(例如使用Local memory暂存数据、利用合并访问规则等),并且在不同的OpenCL计算设备上也是运行相同的OpenCL代码来进行测试。这保证了GPCBenchMarkOCL是目前比较容易找到的较为干净的测试软件,它可以真实反映硬件特性对不同数据类型的适应程度,这一点最重要。
GPCBenchMarkOCL支持AMD RV770及Evergreen(R800)系列,以及NVIDIA G8x、G9x、GT200、GT21x、GF100等GPU的OpenCL平台。我们选用的测试平台同上一节。
分析上图得到的测试数据我们可知,在纯吞吐环境中,AMD延续了R600架构以来的特性,其浮点吞吐量的优势得以体现。特别是浮点运算(单精度)测试中,HD5870压制了强大的Fermi架构GTX480。在密码学测试中,因为很少牵扯到计算层面,GPU只是不断随即生成数据然后去试探,所以A卡理论吞吐量高的特性再次得到体现。
但是只要涉及到常规数学方法测试,这种实际运算环境中将会包含大量跳转嵌套分支等指令,只有运算器组织得当的GPU,才能有效避免理论值的大幅度衰减。A卡因为其架构设计原因,大幅度落后于Fermi架构。
其中HD5870落后最为明显的图像处理,包括亮度直方图绘制、2维卷积(锐化)、快速非局部均值法降噪、图片缩放(双立方滤波)。这项测试主要考虑GPU的全局存储器和纹理访问能力,同时局部存储器原子操作也占到一定比重,所以架构较新的Fermi系列产品表现优异。
我们将涉及存储器的测试归类到存储总评,密码学和单双精度浮点乘加归类到吞吐总评,图像处理和单双精度图形处理归类到计算总评,得到以上测试结果。这个结果可以非常直观地告诉我们在浮点吞吐中,R800由于其SIMD核心内的5D ALU采用VLIW技术,所以遇到规范的数据类型时可以表现出近乎满载的效率,而NVIDIA从G80到GF100芯片都面临吞吐量受制于流处理器结构的影响。
但是一旦牵扯到包含大量跳转嵌套分支等指令的常规数学方法测试,NVIDIA对ALU阵列的组织形式优化立刻体现出优势,此时AMD的VLIW Cores无法满载运行,每一时刻都有大量运算单元空闲。
另一个值得注意的地方就是NVIDIA GPU在局部存储器和全局存储器测试中表现优异,特别是全局存储器在197-257的驱动升级中提升了将近50%,这充分反映了GPU加入通用Cache的重要性。这里的局部存储器是寄存器到cache或者shared memory,全局存储器是cache或者shared memory到显存。我们估计NVIDIA优化了Cache的命中率。cache的命中来自对内存系列也就是显存的命中,所以GPU的整体效率会受益于Cache单元的不断优化。
先进混合架构之Larrabee展望
● 先进混合架构之Larrabee展望
早在1998年2月,Intel发布了和Real3D合作设计的i740/i752独立显卡,虽然该产品在当时性能没有达到领先,但是凭借强大的推广与Intel自身的大厂优势,确实让其独立显卡红极一时。但由于各大竞争对手的3D显卡性能遥遥领先,加上Intel忙于自己的平台化策略,风光一时的i740/i752成为Intel独立显卡的“绝唱”。
相隔十多年,Intel在平台化战略中取得了巨大成功,Intel在集成显卡市场的占有率超过了50%,从810/815系列到845/865系列,再到G41/H55系列主板芯片组,Intel的集成显卡战略所向披靡。Larrabee计划正是在此背景下提出,它将向世人证明Intel拥有开发高端独立显卡的能力,同时巩固市场占有率,改变人们对其显卡视为“鸡肋”的看法。同时Larrabee还肩负开拓GPU通用计算市场的重任,Intel希望这款GPU能够有效抵御NVIIDA和AMD对于并行计算市场的侵蚀。
Larrabee属于单芯片TFLOPS级别运算项目
Intel使用CPU经典原理和最新技术改良了传统GPU,使其集成了数目可观的X86核心,并采用顺序执行,同时辅以先进的CSI总线和高速存储系统,形成了Larrabee芯片概念。Larrabee芯片隶属于Tera-Scale项目,是一块融入的诸多先进技术的GPU。对于图形工业而言,Larrabee是一款具有革命意义的产品,它与常规的意义上的GPU存在理念上的差异,即Larrabee将通用计算性能放在优先位置。Intel高级副总裁Pat Gelsinger表示,Larrabee是一种可编程的多核心架构,采用顺序执行架构(CPU为乱序执行核架构),并使用经过调整的x86指令集,在运算性能上将达到万亿次浮点运算的级别。
Intel之所以会这样设计Larrabee硬件架构,出于以下几个方面的考虑,或者说Larrabee有以下几项显著特点:
1、X86架构核心:GPU在可编程方面的劣势恰好是CPU的优势,GPU不断追求的可编程性对于CPU则非常容易。CPU只要采用相应的指令集结构就可以支持采用该指令集编写的所有程序,而不必理会用户的软件使用环境。
如图Larrabee芯片架构。当然,相对于GPU提供完美的可编程性正是X86架构的特性。Intel的X86架构通常被称作IA架构,它主要由存储控制部分、前端解码器部分、执行单元部分构成。所有基于CISC的代码都将经过解码器并翻译为类似RISC的样式,高效的译码系统会保证CPU接收到自己完全可以执行的RISC风格代码,有利于简化处理器执行流水线的设计,而且在提高性能的同时能确保兼容性。
Larrabee使用X86架构一方面由于Intel多年的技术积累可以轻松驾驭芯片的逻辑设计,另一方面我们也要看到Intel已经将目光放在更长远的通用计算领域,它要通过完美的可编程性来达到比竞争对手更优秀的兼容性,更大程度上拓展通用计算的应用范围。相较于 GPGPU(甚至是自家的 80 核处理器,也不是采用 X86 架构发展的)目前多数的软件工程师仍不熟悉如何将 GPU 应用在多任务处理及平行运算上,Larrabee将在普及大规模并行运算上占有很大优势。
2、顺序执行单元:Larrabee所使用的X86架构不同于目前CPU的重要区别是顺序执行。在很早以前的顺序执行CPU中,当装载指令队列发生等待时,处理器不能将队列后方处于等待的指令优先装载并执行,一直等待到堵塞结束。平均而言约30%的指令会发生一定时间的堵塞,这种执行方式叫做顺序执行,显然降低了执行单元的效率。乱序执行在1995年的Pentium Pro处理器上首先实现,它可以最大限度利用资源,这种设计一直沿用至今,Core微架构可以说实现了目前最高水准的乱序执行。
而这次Intel在Larrabee设计中重新引入顺序单元,是有充分理由的。顺序执行让一条线程中的各个指令根据其原有顺序逐一执行,这样芯片内部就完全无需加入用于指令分析和运算结果合成的逻辑,从而极大地减少晶体管使用量。而效率低下的问题使得业界一致认为乱序执行要强于顺序执行。但最近几年,随着高频率和多线程技术的不断发展,许多厂商认为顺序执行的单线程性能低下优势已经可以通过增加线程和提高频率来弥补,反而晶体管使用过量会造成发热和功耗很难控制。
Intel根据对比得到,乱序执行内核需要至少50平方毫米的面积,最少37.5W功耗。而使用了顺序执行,单个内核面积只有10平方毫米,功耗也下降到6.25W。在Intel的实验芯片上,使用顺序执行与VLIW指令集,在10平方毫米的面积上可同时运行4条线程和16个512bit向量,最终达到128 GFLOPS的浮点运算性能。面对Tera-Scale项目要求的TFLOPS性能目标,在顺序执行的X86核心思想下,只需多个核心即可完成。
但是业界对于Larrabee这颗芯片的观点还是众说纷纭:AMD指出如果Larrabee处理器的通用性是基于适合流处理器而进行设计的话,那么其图形性能将不足以使其成为一款专业的GPU产品,另外就是我们还必须考虑到其图形处理器性能也不会很高。
有一种观点认为X86架构限制了CPU性能的发展,但是所谓限制不能光看硬件。如果这套架构能给编程者提供统一完善的可操作性强的编译环境和在这个环境下相对充沛的资源,那这个构架即不是效率最高的构架,但却是目前环境下唯一理想的构架。
也有评论家认为X86的指令集通用性会更好一些,但是并不适合于并行处理。而对于AMD公司的Fusion则是将X86的CPU与GPU核心进行合并,这样CPU可用于一般数据处理,而GPU核心可以进行并行数据处理,从而可以实现最优化处理。简单的说就是AMD保持了X86 CPU和GPU各自的特征。这样避免了过大的新技术开发投入,现有软件也能够更好地使用其Fusion处理器资源。
NVIDIA也有自己的打算,该公司也没有明确表示将来是否在GPU产品上加入对X86指令集的支持,这也是NVIDIA公司与另外两家CPU生产厂商间的关键差异。NVIDIA表示其没有X86核心绝不能算作是弱点,NVIDIA相信自己所选择的发展方向,其Tesla计划正在加紧推进,目前在高性能计算领域已经打开市场。同时NVIDIA正在进行据并行处理最佳指令集的研发,计划进一步扩充GPU的性能,这一代的Fermi架构GF100芯片已经轻松达到1TeraFLOPS的单精度浮点运算性能,双精度浮点的衰减也控制在单精度浮点性能的1/2。
概念型融合架构之Fusion APU展望
● 概念型融合架构之Fusion APU展望
在2006年10月25日,AMD完成对ATi的收购后就公布了“Fusion”架构,并预计在2009年底或2010年发布,成为K10微架构的后继者。Fusion架构同时也是Torrenza统一加速计算平台的一部分,配合FireStream流处理器进行协同运算。Fusion架构预计内置一颗中低端GPU,这样这款CPU就可以独立完成PC系统内的各项工作,这就是AMD提出的APU(Accelerated Processing Units)概念。
Fusion架构logo
AMD Fusion是AMD与ATI合并后推出的一项新产品的产品代号,它结合了现时的处理器和绘图内核,在处理器进行图像和三维(3D)运算。AMD Fusion的硅芯片上有两个独立的内核,一个负责处理器,另一个负责绘图内核,两个内核而不是融合在一起。处理器有自己独立的缓冲存储器,绘图内核部分同样如此。两个内核会通过CrossBar互相连接。此外,Fusion亦会集成存储器控制器。Fusion中的各个组件之间使用HyperTransport连接,使各个组件连接成一个整体。处理器和绘图内核可以直接访问存储器,但绘图内核没有独立的显示存储器。南桥不会集成在Fusion芯片中。
APU融合有很多种方向可以发展,既可以把低端显卡整合进CPU,又可以通过CPU的L3让GPU与CPU的联系更加紧密。最终,SP可以被慢慢的剥离出来单独使用,既可以加强FPU,又可以干一些指令集干的事情,或者说达到一些指令集操作才能达到的结果,比如更大的运算能力。
在AMD现阶段无法开发出效率极高的指令集时,用硬件单元来补足执行效率的不足是非常明智的选择,Fusion架构的代表APU就是这种思路下的产物。毕竟开发指令集需要对硬件架构做出优化,寄存器和相关资源都需要进一步放大,这也需要增量晶体管来辅助。而整合GPU则意味着AMD可以把ATI GPU中的流处理器单元直接变为浮点运算器(FPU)。这样的整合会相对简单,同时Intel和NVIDIA由于技术上的缺失都无法涉足。
从上图我们可以获知,APU将芯片内的不同物理单元抽象成两个逻辑部分,分别是串行计算单元和并行计算单元。我们知道这分别是传统CPU和GPU 的两大特性。APU使用一颗类似SoC概念的芯片设计,让不同层面的用户在低端市场上同样能够获取到“异构计算”(heterogeneous computing)能力,这是对于独立CPU+独立GPU计算的重要补充。
GPU进化架构之Fermi分析
● GPU进化架构之Fermi分析
GT200发布时其宣传口号是所谓的Gaming Beyond和Computing Beyond,这个宣传口号第一次鲜明地体现了NVIDIA的GPU设计方向发生了明显变化。GPU Computing概念的提出,说明了GPU身份已经转变为一颗通用计算处理器。同时NVIDIA需要为开拓GPU通用计算市场而做出一些设计方面的变化。
而不久前发布的Fermi架构GTX400系列显卡,正是这一概念的深刻体现。代号GF100的Fermi设计方案在4年前确定下来并付诸行动,这时正值代号G80的Geforce 8800GTX做最后的出厂准备。G80凭借全新的MIMD(多指令流多数据流)统一着色器(又称流处理器)获得了业界的一致认同,同时被业界关注的还有G80的通用计算性能。
NVIDIA的Tony Tamasi先生(NVIDIA高级副总裁,产品与技术总监)表示:“以前的G80架构是非常出色的图形处器。但Fermi则是一款图形处理同样出色的并行处理器。”
这句话揭示了Fermi的与众不同,它已经不再面向图形领域设计了,因为更广阔的通用计算市场在等待它。Fermi将为通用计算市场带来前所未有的变革,图形性能和游戏被提及已经越来越少。
从NVIDIA处理器架构的发展来看,Tamasi先生的话意思很清楚。回顾历史我们可以发现NVIDIA最近几年间,大规模改进图形处理架构设计的是GeForce 6000(NV40)系列,之后就是GeForce 8000(G80)和GeForce GTX 200(GT200),最后就是Fermi。
“CUDA Cores”是Fermi最基础的运算单元,将它的历史向上追溯首先是G80时代的统一着色单元(Unified Shader Model),我们在G80和GT200时代将它统称为流处理器(Stream Processor),再向上追溯可知,这个单元将Vertex Shader(顶点着色器)和Pixel Shader(像素着色器)合并而成。
理论上说“CUDA Cores”只是起了一个好听的名字,让人们更看重GPU通用计算的作用,实际上我们在图形领域还是将它视为普通的流处理器。但这背后透露出NVIDIA公司的另一种计划——面向并行计算领域设计一颗芯片,并使其具备图形运算能力,这颗芯片由众多的“CUDA Cores”组成,运算速度主要由“CUDA Cores”的数量和频率决定。
在没有了解Fermi的核心构成之前,很多人“CUDA Cores”概念嗤之以鼻,认为这是NVIDIA公司的营销策略,就像HD5870所拥有的1600个流处理器一样,实际上是320个SIMD单元。两家公司确实打了不少口水仗,无数玩家也跟着它们提出的概念升级了自己的显卡。不过这次Fermi改变名称和设计方向,是有备而来的。
Fermi架构视频解析
NVIDIA这次敢提出图形性能和通用计算并重,说明GPU设计的重点和难点都在通用计算方面而非图形。因为一颗已经演化了十年的GPU肯定能做好自己的老本行图形计算,但是要做通用计算,需要更强大的线程管理能力,更强大的仲裁机制,丰富的共享cache和寄存器资源以及充足的发射端……如果做不好这些东西,GPU永远都是PC中的配角,永远都是一颗流处理器。这些表面上看这些部件是极占晶体管的东西,更可怕的是设计这些部件需要太多科研成本和时间。
Impress Watch网站知名IT评论人後藤弘茂称NVIDIA全新Fermi架构,是以处理器为目标进行设计的。因为你在Fermi身上可以看到以前GPU上从来没有的东西,包括更多的指令双发射、统一的L2全局缓存、64KB的可配置式L1或者Shared Memory、大量的原子操作单元等等。
第五章:ATI GPU通用计算实例
● 第五章:ATI GPU通用计算实例分析
前四章我们分析了GPU并行计算的技术基础和不同架构之间的性能差异。我们特别对ATI GPU从R300到R600的沿革和R600到现在R800的优化做了分析,让大家明白ATI GPU架构在哪些方面有出人意料的表现,哪些方面则表现地落后于竞争对手。在本章,我们将使用较小的篇幅来展示目前GPU并行计算编程方面的新进展,特别是GPU并行编程API的相关发展情况。
让我们把时间调回到2003年,当时正值Shader Model 2时代。随着GPU计算能力的不断增长,一场GPU革命的时机也成熟了。Shader模型的不断发展使得GPU已经从由若干专用的固定功能单元(Fixed Function Unit)组成的专用并行处理器,进化为了以通用计算资源为主,固定功能单元为辅的架构,这一架构的出现奠定了GPGPU的发展基础。
SIGGRAPH 2003大会开始深入研究GPU通用计算
当时在圣迭戈举行的SIGGRAPH 2003大会上,许多业界泰斗级人物发表了关于利用GPU进行各种运算的设想和实验模型。SIGGRAPH会议还特地安排了时间进行GPGPU的研讨交流。在2004年9月份,剑桥大学的BionicFx课题组便宣布在NVIDIA的GeforceFX 5900产品中实现了专业的实时音频处理功能,并且准备进行商业化的运作,对其产品进行销售,给音乐创作者带来实惠。
在随后的一段时间,GPGPU进入了深入研究阶段,但是由于编程语言架构和编程环境都难以通用,该领域的发展能力受到广泛质疑。就在人们认为GPGPU的研究即将偃旗息鼓的时候,ATI在2006年8月惊人地宣布即将联手斯坦福大学在其Folding@Home项目中提供对ATI Radeon X1900的支持。在显卡加入Folding@Home项目后,科研进展速度被成倍提升,人们第一次感受到了GPU的运算威力。
毫无疑问,在GPGPU研究上,ATI跨出了极具意义的一步。同时将GPGPU的应用领域和普及程度推向高潮。随后NVIDIA凭借GeForce 8800GTX这款业界首个DirectX 10 GPU,在GPU通用计算方面实现了大步跨越,特别是CUDA概念的提出(该工具集的核心是一个C语言编译器),在新的通用计算领域后来居上。
GPU在很多领域的研究中已经开始发挥作用。支持DirectX 10显卡的首次出现是一个分水岭:过去只能处理像素或者只能处理顶点的专门功能处理单元被通用的统一着色器架构(Unified Shader Architecture)取代了,开发人员可以更轻松的对统一着色器进行控制。以AMD R600和NVIDIA G80为代表的DirectX10时代GPU能够提供了超越以往任何GPU的能力:它们拥有数百个功能单元,能够处理很多过去只能在CPU上运行的并行问题。
GPGPU将应用范围扩展到了图形之外,无论是科研教育、财务计算,还是在工业领域,GPGPU都得到了广泛的使用,关于它的科研成果和新应用模式也层出不穷。许许多多令人鼓舞的结果已经表明:将GPU用于解决数据并行计算问题可以明显提高系统的运行速度。本章我们会对目前炙手可热的GPU并行编程API做简单介绍,同时向用户推荐几种基于ATI GPU产品的通用计算项目,他们基于开放式的BOINC平台或者形成独立的开放式平台,我们可以通过下载软件来参与这些项目体验GPU通用计算带给业界的变革。
ATI Stream技术发展与现状
● ATI Stream技术发展与现状
ATI Stream技术是一套完整的硬件和软件解决方案,这个概念最初在2005年依据R580核心的流处理加速卡提出。随后ATI被AMD收购,异构计算概念被越来越多的提及,Stream技术被定义为能够使AMD图形处理器(GPU)与系统的CPU协同工作,加速处理图形和视频以及其他大量应用。该技术使更加平衡的平台能够以前所未有的速度运行要求苛刻的计算任务,为最终用户提供更出色的应用体验。
两家GPU厂商提出的通用计算解决方案
无论是NVIDIA还是AMD,都正在与领先的第三方行业合作伙伴和全球范围的学术机构一起,建立完整的GPU计算生态系统。AMD系统通过Stream技术能够提供实现AMD低成本应用加速所必需的性能、应用、软件和工具。我们也不得不意识到两家公司在计算机专业领域的影响力是不可估量的,因为它们能通过GPU提供更好的并行计算加速比。
Brook+是AMD出的显卡编程语言,它和NVIDIA提出的CUDA C是对应的。只不过CUDA的基础是C和C++,而brook+是汇编。brook+环境下写程序不是那么容易的,毕竟它属于低级语言,但是那是程序员和推广的问题,一旦写出来了效率通常都很高的。所以说汇编是底层语言,效率很高但是兼容性和简易型较差。
ATI Stream技术定义程序可以被分为两种,也就是图中的库,以及第三方代码。库可以直接转化成brook+,第三方代码则需要通过stream编译一下。编译好的东西可以直接丢给CPU或者GPU算。其中绿色的是计算抽象层规则。这张图片说明ATI GPU可以通过计算抽象层规则直接运行程序,也可以通过OCL来支持应用程序,也就是说OCL只是其中一种选择。实际上AMD倒向OCL,应该也有打算让自己以第一的身份接近OCL制定者并影响对方甚至施压的意思。CUDA和Stream都是编译环境,而OpenCL跟DirectX都是API。
从特性方面分析,Stream是基于一种传统的编程方式,Stream主要包括CAL与Brook+。CAL是一套指令集,可以用汇编语言的方式来开发软件,虽然我们汇编方式开发软件的话,对搞计算的人来说不大现实,让他们用汇编语言来说的话可能确实是一种折磨,但是这种方式更为接近硬件,合理优化可以大幅度提升运算效率。Brook+是斯坦福大学开发的,它是类似于C语言的东西,是把底层GPGPU的计算方式类似于C的这种语言,这里要说明的是Brook+不是C语言而是类C语言,语法和C语言比较类似。
从R600到R800时代,的每个流处理单元都包含5路超标量体系结构着色处理器,单时钟周期可以最多处理5个标量乘加指令,其中一路着色处理器负责处理超越指令(比如Sin、Cos、Log、Exp等等)。我们看下图就可以明白,5个黄色的长方形就是5路着色处理器,其中较大的一个就是可以处理超越指令的着色处理器。流处理单元可以达成32-bit浮点精度,支持整数和逐位操作,图中紫色的长方形“分支执行单元”则负责进行流控制和条件运算。
OPEN CL接口技术与异构运算
● OPEN CL接口技术与异构运算
2010年8月16日,AMD宣布推出全面支持OpenCL 1.1的ATI Stream软件开发包(SDK)2.2版,新版本的SDK为开发人员提供开发强大的新一代应用软件所需要的工具。这一版本的最大意义在于它表明了AMD在不断追求与开放性应用程序接口OpenCL的兼容,同时AMD再通过OpenCL快速提升其在业行内的影响力,毕竟借助这一标准,AMD和NVIDIA站在了统一起跑线上,OpenCL接口对于一个技术与标准的追随者来说是千载难逢的机会。
著名的开发组织Khronos发布了OpenCL(Open Computing Language)
在Open CL发布之前,AMD/ATI支持BrookGPU模式,并有了升级版本的SDK Brook+。虽然Brook+可以实现GP-GPU计算,但是整个行业已经意识到需要出台某种标准。作为图形芯片的两大巨头,NVIDIA拥有自己的CUDA架构,AMD有自己的Stream架构,同时本次他们又是OpenCL的支持者。在OpenCL标准发布之后,AMD和NVIDIA立即表态,宣布即将采用OpenCL 1.0编程规范。AMD正在不断将合适的编译器和运行库整合进免费的ATI Stream软件开发包(SDK),作为OpenCL的创始人之一,AMD一直以来都极力推崇OpenCL,并在2009年上半年开发出ATI Stream SDK的开发者版本,实现对OpenCL 1.0的支持,如今ATI Stream软件开发包(SDK)2.2版的发布进一步支持这一标准向前推进。
OpenCL对开发者、业界人员和消费者来说都是一个非常好的API,它可以使得开发者很容易的开发出跨平台的GPU计算程序,充分利用GPU强大的计算能力然后应用在各种领域。同时OpenCL对于异构运算的支持也开始明朗化。
OpenCL标准所提倡的CPU-GPU异构计算
我们知道CPU和GPU各有所长,一般而言CPU擅长处理不规则数据结构和不可预测的存取模式,以及递归算法、分支密集型代码和单线程程序。这类程序任务拥有复杂的指令调度、循环、分支、逻辑判断以及执行等步骤。例如,操作系统、文字处理、交互性应用的除错、通用计算、系统控制和虚拟化技术等系统软件和通用应用程序等等。而GPU擅于处理规则数据结构和可预测存取模式。例如,光影处理、3D 坐标变换、油气勘探、金融分析、医疗成像、有限元、基因分析和地理信息系统以及科学计算等方面的应用。
尽管在不少方面GPU表现优异,但在一段时间内,还会维持CPU与GPU各自发展的态势,它们可以继续在各自擅长的领域发挥作用,而未来的演进方向是相互取长补短,走向融合,而OpenCL正是它们融合与并行发展的连接桥梁。从CPU角度来讲,为了提高处理能力,以前是多线程,目前是多核,将来的发展方向是众核。
OpenCL的标准很大程度上决定了它的未来。获得整个计算机/视频硬件行业的支持也将起到帮助作用。从独立软件开发商的角度来看,OpenCL是通向混合(GPU/CPU)计算的大门。任何涉足高性能计算领域的人都会告诉你,在非标准的API上投入资金和时间是一项具有风险的业务,而OpenCL显然具备更大的潜力。
CPU正向不断增加吞吐量和提高能效性的方向发展;而从GPU角度来讲,其可编程性能本来是在芯片内部固化的程序,然后发展到局部可编程,最后是完全可编程。也就是说,GPU是在提高所处理的吞吐量的同时,向通用处理的方向发展。作为一直在标准推广方面相对落后的AMD,本次借助OpenCL刚好可以实现更深层次的异构运算,其高端CPU甚至是未来整数性能极强的CPU会在OpenCL接口的帮助下,和高端GPU产品在异构模式下共处。而低端市场的APU产品,也会受益于OpenCL接口而支持更多应用,释放CPU和GPU的计算特性。
ATI Stream硬件通过Open CL获得了更为专业的支持
在今年6月,CAPS荣幸宣布其基于指令的混合编译器HMPP最新2.3版本已发布,内含OpenCL代码生成器。HMPP编译器集成了支持NVIDIA CUDA和OpenCL的强大数据并行后端,可极大缩短开发时间。OpenCL版HMPP完整支持AMD和NVIDIA GPU计算处理器,从而为广大混合计算应用开发者提供了广泛的程序开发支持。
Havok引擎与CPU+GPU异构运算
● Havok引擎与CPU+GPU异构运算
目前在游戏中应用最广的物理效果有粒子、流体、软体、关节和布料五大类,借助这些效果,我们的图形世界将会变得更加真实细致。从游戏发展的轨迹来看,大家都在力求一种“现实”的效果,从最1994年Doom Ⅱ那种粗糙的3D效果到2008年的Crysis,游戏的3D效果和光影效果都有了长足的进步。如何让游戏表现出更真实的一面,放在大家面前的有两条路。第一条就是增加特效,如DX8、DX9、DX10,这样的特效更多表现的是一种“静态”的效果。而另一条路则是增加如爆炸、布料摆动、关节运动等“动态”方面的真实效果。
物理运算有两大特点,第一是高并行度,第二是高运算密度,这两大特点刚好符合我们之前所分析的并行计算结构,所以从物理效果提出之时,人们就在寻找加速比更高的硬件解决方案来进行物理运算。AGEIA公司在GDC2005游戏开发者大会上推出了物理处理器PPU(Physics Processing Unit),被称为05年度图形领域的重大技术创新。这种芯片可以通过其内部的大量并行浮点处理器来运算物理特效,解放任务繁重的CPU。不过PPU的劣势就是需要附加运算卡才能实现,功能较为单一,整体实现成本方面也没有做到最优。
物理引擎发展的挑战与应对
随后使用GPU进行物理加速走进了人们的视野,GPU天生拥有较高的并行度,同时其内部可编程浮点单元能够执行物理运算。同时随着GPU内部结构不断完善,调度器、发射端和寄存器资源已经能够支撑GPU进行损失较小的上下文切换,这是GPU在执行图像渲染的同时进行物理加速工作的前提。而NVIDIA和AMD也都选择了相应的物理加速引擎为自己服务。
和现在广为人知的PhysX物理引擎相对的是AMD选择的Havok物理引擎,这是业界知名度最高的拥有广泛游戏资源支持的物理引擎。Havok发展到2005年的时候,已经可以在微软的视窗操作系统、Xbox与Xbox360,任天堂的GameCube与Wii、索尼的PS2、PS3与PSP、苹果电脑的Mac OS X、Linux等操作系统或游戏主机上使用。此游戏引擎是用C语言/C++语言所撰写而成。
2006年,Havok物理引擎在基于CPU系统上获得众多支持的时候终于决定转向GPU系统,Havok FX引擎应运而生。Havok FX将物理运算分为特效和游戏运算,特效运算(如爆炸时的烟雾)将会由GPU的Shader Model 3.0来进行运算,进而减轻CPU的负担。而游戏物理运算则仍然由CPU处理。
但是随着Havok被Intel收购,基于GPU的物理引擎开发几乎陷入停滞。因为Intel当时的CPU发展思路已经转向了提高并行度,同时Intel程序中充满分支和循环嵌套的物理特效在GPU上难以完成,所以Intel让更多物理效果在CPU上运行。但是后期的GPU发展远超Intel预料,所以后期Havok还是和AMD不断合作谋求在GPU带来的更高加速比。
在GDC09展览中,演示中的Havok引擎使用了ATI的显示核心作为加速。由于引擎是基于OpenCL架构进行开发,所以处理器和显示核心都可以为其进行计算。基于GPU的Havok引擎发展,意味着AMD提倡多年的异构计算模式终于在更多领域找到了用武之地。虽然目前Havok引擎在GPU上的游戏数量少之又少,但是Havok引擎在CPU支持方面垄断了绝大部分游戏的物理加速接口。同时随着更多的CPU-GPU异构模式Demo推出,物理运算加速比相比纯GPU模式将会更好。
BOINC平台充沛的ATI GPU加速项目
● BOINC平台充沛的ATI GPU加速项目
如果你使用ATI显卡,不必去寻找那些高深的专业计算程序去体验GPU并行计算的魅力。体会ATI GPU的强大运算能力,只需加入BOINC平台就可以获得大量项目支持。从并行计算的分类层级来看,BOINC平台计算项目属于最高层级“集群或分布式计算”(Cluster/Distributed parallel)。
BOINC的中文全称是伯克利开放式网络计算平台(Berkeley Open Infrastructure for Network Computing),他能够把许多不同的分布式计算项目联系起来统一管理。并对计算机资源进行统一分配。BOINC目前已经成熟,多个项目已经成功运行于BOINC平台之上,如SETI@home、LHC@home、Rosetta@Home 、World Community Grid世界公共网格等。
BOINC分布式计算平台
MilkyWay@home是一个基于 BOINC 平台的分布式运算项目。项目试图精确构建银河系附近星流的三维动态模型。与 SETI@home 和 Einstein@home 相比较,MilkyWay@home 同样把探索星际空间作为项目目标。项目的另一个目标是开发并优化分布式计算的算法。该项目在今年年初已经汇聚了超过1PetaFlops运算能力,运算速度超过了世界上第二快的超级计算机,该项目在推出后不久就提供了支持ATI显卡的运算程序。
除了在计算机科学和天文学研究的重要发现外,研究人员表示,该项目对于公众的科学发现也作出了重要进展。自项目开始至今,来自 169 个国家超过 45000 名的志愿者捐献了计算能力,目前项目活跃的用户约有1.7万。除了志愿者外,伦斯勒其他学科及院外的机构也参与该项目。其中包括伦斯勒的研究生 Matthew Newby,Anthony Waters,and Nathan Cole 还有 SETI@home的创始者David Anderson,这项研究的资金主要由国家科学基金会(NSF)提供,还有 IBM,ATI 和 NVIDIA捐献的设备。
MilkyWay@home项目模拟(配图来自“科学松鼠会”《银河之伴,汝居何方》)
MilkyWay@home这个项目折射到计算机硬件方面,实际上就是像素对比,是对比进化算法得来的银河系演进图与真实拍得的照片的差异。它是按照进化算法先验算一个银河系在某时间断面的图,然后那这个图跟拍摄的实际照片进行对比。Milkyway@home虽然是研究天体的项目,但这种研究算法天生具有遗传算法的特性,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;Milkyway@home提供的ATI显卡计算任务具有内在的隐并行性和更好的全局寻优能力,这个项目里更多的也不是分支嵌套,而是把算好的结果跟已知的观测结果进行比对,这样ATI GPU架构吞吐量巨大的优势再一次体现了。
另一个活跃在BOINC平台上的支持GPU计算的项目是Collatz Conjecture,这是一个利用联网计算机进行数学方面研究,特别是测试又称为3X+1或者HOTPO(取半或乘三加一)的考拉兹猜想的研究项目。该项目的运算目的很简单,变量只有一个n,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。这个项目的研究目标就是寻找最大的质数。
该项目的主程序分支出现在初始段,而且所有的线程的分支几乎都是统一的,所以对于分支能力的考验是比较少的,反而它能够使几乎所有线程都同步进行这个相对简单的吞吐过程。这就决定了该项目上ATI GPU的运算速度要比NVIDIA GPU快,因为ATI所提供的硬件结构更适应于这种数据结构。
Radeon HD5770显卡正在运行DNETC@home项目的ATI加速任务
BOINC平台同样有一些密码学项目可以发挥ATI GPU的浮点加乘优势,比如在近期提供了GPU运算支持的DNETC@home项目。DNETC@HOME 是 distributed.net 在 BOINC 平台的封装器,用于使其平台的项目能够运行于 BOINC 平台上。Distributed.net 创立于1997年。2002年10月7日,以破解加密术而著称的 Distributed.net 宣布,在经过全球33.1万名电脑高手共同参与,苦心研究了4年之后,他们已于2002年9月中旬破解了以研究加密算法而著称的美国RSA数据安全实验室开发的64位密匙——RC5-64密匙。目前正在进行的是RC5-72密匙。
目前DNETC@home项目运行的是 RC5-72(试图攻破 RC5 的 72 位密钥)。值得一提的是项目没有提供 CPU 的计算程序,因此要参加项目必须使用显卡才能进行计算。
我们在第四章第六和第七节已经通过GPC Benchmark软件分析了ATI GPU在密码学计算中的优势。在DNETC@home项目这类密码学计算中,无论是加密还是解密都很少牵扯到计算层面,GPU只是不断随即生成数据然后去试探,决定运算结果的基本上只有开关(运算器)数量,而不是运算器组织结构,所以A卡理论吞吐量高的特性再次得到体现。
最具影响力的Folding@home项目
● 最具影响力的Folding@home项目
Folding@home是一个研究蛋白质折叠,误折,聚合及由此引起的相关疾病的分布式计算项目。我们使用联网式的计算方式和大量的分布式计算能力来模拟蛋白质折叠的过程,并指引我们近期对由折叠引起的疾病的一系列研究,找到相关疾病的发病原因和治疗方法。
Folding@home能了解蛋白质折叠、误折以及相关的疾病。目前进行中的研究有:癌症、阿兹海默症(老年失智症)、亨廷顿病、成骨不全症、帕金森氏症、核糖体与抗生素。
不同硬件为Folding@home项目提供的运算能力
您可以在斯坦福大学官方网页上下载并运行客户端程序,随着更多志愿者的计算机加入,此项目计算的速度就越快,就会计算出蛋白质在更长时间内的折叠,距离科学家找到最终答案也就越来越近。如果蛋白质没有正确地折叠将会使人得一些病症:如阿兹海默氏症(Alzheimers)、囊肿纤维化(Cystic fibrosis)、疯牛病(Mad Cow, BSE)等, 甚至许多癌症的起因都是蛋白质的非正常折叠。
Folding@home所研究的是人类最基本的特定致病过程中蛋白质分子的折叠运动。项目的核心原理在于求解任务目标分子中每一个原子在边界条件限制下由肽键和长程力等作用所导致的运动方程,进而达到实现模拟任务目标分子折叠运动的目的。每一个原子背后都附庸这若干个方程,每一个方程都可以转换成一组简单的向量指令。同时由于长程力的影响,条件分支也随处可见,Folding@home在GPU使用量上也要大于图形编程。
在分子动力学领域广泛使用的GROMACS引擎
由于针对不同的系统其代码进行了高度优化,GROMACS是目前最快的分子动力学模拟软件。此外,由于支持不同的分子力场以及按照GPL协议发行,GROMACS拥有很高的可定制性。GROMACS目前最新版本为4.07,可以到官方网站下载并自行编译。GROMACS支持并行/网格计算扩展,可灵活搭配MPI规范的并行运算接口,如MPICH、MPICH2、MPILAM、DeoinMPI等。国内也有很多分子动力专业人员同样使用GROMACS做研究,而且几乎是全部,GROMACS几乎成为模拟蛋白质折叠领域内的标准。
2006年9月底,ATI宣布了通用计算GPGPU架构,并得到了斯坦福大学Folding@Home项目的大力支持,加入了人类健康研究。2007年3月22日,PS3正式加入史丹佛大学分布式运算研究计划,至今已有超过百万名 PS3 玩家注册参与。NVIDIA于2008年6月宣布旗下基于G80及以上核心的显卡产品都支持该项目的通用计算,更是对分布式计算的重要贡献。
Radeon HD4870显卡正在运行Folding@home项目
Folding@home在自身定位明确、成功发展的基础下,通过斯坦福大学的大力推广,已经获得了全世界广泛认同。而近期PS3和GPU的参与更是将Folding@home的运算能力推向高峰。值得一提的是NVIDIA在2008年6月果断宣布加入Folding@home项目,至今已经为该项目提供了超过2 PFlops运算能力。
目前Folding@Home已经成为全世界最有影响力和公信力的项目,同时是各大厂商和机构鼎力支持的项目,当然它毫无疑问地拥有最广大的志愿者团队——截止2010年4月18日,全球共计1,396,683人参与该项目,最近的统计显示志愿者贡献的总运算能力已经达到了5PFlops,远超现在全世界最快的超级计算机IBM Roadrunner(最高性能1.026PFlops)。
该项目在中国拥有约2000多名参与者,其中最强大的China Folding@Home Power(Folding@Home中国力量,团队编号3213)团队已经拥有2585人,最近活跃用户200人以上,目前贡献计算量排名世界第47位,团队整体运算能力约为50到100TFLOPS。
GPU架构对于其他实例的适应性
● GPU架构对于其他实例的适应性
前文提到的几种GPU计算项目,都是一些非常直接具体的科学计算项目,它们是用户直接体会GPU计算的最简单途径。除此之外,还有大量实例可以在GPU上完成运算,特别是ATI提供的这种硬件架构可以在一些特殊运算中获得极高的加速比。
比如对于那些很难解决或者不可能精确求解的问题,蒙特卡洛算法提供了一种近似的数值解决方法。蒙特卡洛仿真与生俱来的特征就是多次独立重复实验的使用,每次独立实验都有某些随机数驱动。根据大数定律,组合的实验次数越多,最后得到的平均答案就越接近于真实的答案。每次重复实验天生就具有较强的并行特征,而且它们通常由密集数操作组成,因此GPU几乎为蒙特卡洛仿真提供了一个完美的平台。
使用蒙特卡洛算法在正方形内计算π
使用蒙特卡洛算法解决问题的一个简单例子是计算π的值。这需要首先绘制出一个正方形,然后绘制它的内切圆。如果圆的半径是r,圆的面积就是πr2,而外接正方形的面积就是4r2。如果可以计算出圆面积和正方形面积之间的比例系数p,就可以计算π了。使用蒙特卡洛算法在正方形内均匀地生成n个独立的随机点,假设这些点中有k个位于园内,则p≈k/n,既π≈4k/n。点数分布越多,π的值精度就越高,当n=2×104及2×105时得到的近似值分别为3.1492和3.1435。
很明显这种计算π的方法效率很低,因为它的精度增长率很低(精度通常和实验次数的平方根成正比),而且比标准重复方法效率低了很多。然而它却说明了蒙特卡洛算法为何如此盛行的原因:1、该方法通常不是问题应对的精确解决方法,很容易理解它的工作原理。2、只要运算资源充沛,该方法通常容易实现,障碍只是随机数生成。3、蒙特卡洛算法天生就是并行的。其中最后一点正说明了蒙特卡洛算法很容易在网络集群中的多个节点上运行,或者在一个CPU或者GPU内的多个处理器上运行,该算法通用性极强,比如它允许我们为很多没有分析型方案的金融模型寻找解决方案。
第二个要介绍的例子是使用GPU进行Nbody仿真。它在数值上近似地表示一个多体系统的演化过程,该系统中的一个体(Body)都持续地与所有其他的体相互作用。一个相似的例子是天体物理学仿真,在该仿真中,每个体代表一个星系或者一个独立运行的星系,各个体之间通过万有引力相互吸引,如图所示。在很多其他计算机科学问题中也会用到N-body仿真,例如蛋白质折叠就用到Nbody仿真计算静电荷范德华力。其他使用Nbody仿真的例子还有湍流流场仿真与全局光照计算等计算机图形学中的问题。
DirectX 11 SDK Nbody Gravity测试项目
在NVIDIA最初G80架构的Geforce 8800GTX GPU上计算每秒100多亿个引力系统的性能,这个成绩是一个经过高度优化的CPU实现的性能的50多倍。Nbody仿真问题的研究贯穿了整个计算科学的历史。在20世纪80年代,研究人员引进了分层和网格类型的算法,成功降低了计算复杂度。自从出现了并行计算机,Nbody仿真的并行化也开始被研究了。同时从CPU到GPU的现有研究成果不仅仅是为了降低运算的功耗,还可以降低分层度,节省远域计算的时间。
N Body Gravity测试具备两个显著的特点,首先是高并行度,该测试拥有大量相互碰撞的粒子,粒子之间会产生复杂而又数量较多的力量变化。同时该测试拥有较高的运算密度,GPU在处理此类问题时可以有效展现其强大的并行运算能力。
利用开源的杀毒软件ClamAV来基于GPU进行病毒检测
GPU还可以作为一个高速过滤器,来检验计算机病毒,这一原理和MilkyWay@home项目的像素对比有异曲同工之处。作为一个并行数据处理器,GPU擅长于处理那些具有常规的、固定大小的输入输出数据集合的算法任务。因为通过让CPU处理变长的和串行的任务,而GPU处理并行度较高的任务,可以最大限度地利用GPU进行病毒检测。GPU可以使用很少的字节来确定是否可能与数据库中的某个特征匹配,然后GPU再确认所有的匹配。
全文总结与未来架构展望
● 全文总结与未来架构展望
作为本世纪初计算机行业的最大变革,GPU所能处理的任务已经远超图形界限。通过全文分析,相信用户已经了解到了AMD在并行计算技术方面的发展历程和现状,无论是通过Stream技术将GPU用于高性能并行计算领域,还是通过计算机内的CPU-GPU异构模式来完成更多任务,AMD都在努力为用户提供更全面效率更高的解决方案。
关于未来硬件和应用环境的适用方面,Intel是从CPU往中间走,NVIDIA是从GPU往中间走,AMD则是直接空降到了中间。Intel的CPU产品所代表的是极强的逻辑控制包括分支循环等能力和单线程处理能力,ATI和NVIDIA的GPU产品代表的是极强的数据吞吐和并行任务能力。在这两者中间,是目前高性能计算和未来的图形计算所需求的应用,也是AMD想通过CPU-GPU异构计算和Fusion所达到的目标——更为强大的分支仲裁能力和更高的并行度。让我们共同期待在CPU和GPU技术领域长期蛰伏的AMD能借助融合之势回到巅峰状态。
CPU和GPU都在演变过程中
回到我们现在所处的编程环境来考虑,Fusion所提出的融合概念是一条非常好的解决途径。从绝对性能角度来考虑,AMD目前没有最好的CPU,ATI又没有最好的GPU,但是它可能将来会有最好的运算解决方案。而在Intel这边Larrabee还没有放弃,反而加速了。尤其是看到了Fermi之后,Intel更加确信自己的路并没有错。
但是目前的CPU加GPU分离式异构结构并不是万灵药,它需要更复杂的节点设置和控制,还有存储以及更加特异的任务拆解方式。而融合刚好可以很大幅度的消减异构带来的影响,融合不光是成本,还有整个系统的复杂度都可以得到有效降低。当然确实想要真正融合的话,必须要有对应的指令集。
从经济学角度讲,AMD这种直接放流处理器单元进入CPU逻辑的方法相对于开发新的指令集来的更快。AMD所提出的融合的确是个很好的方向,它能够绕开控制型结构,直接给核心提供现成的运算单元。使用这种简易直接的融合方式可以在高性能计算和并行计算领域为AMD赢得一块领地,而长远考虑仍然需要优秀的指令集和更为深层次的融合方式。
融合与异构或许都能够受惠于Intel提出的全新AVX指令集。这种指令集可大大提高浮点、媒体和处理器密集型程序的性能,重点在于AVX从当前的128bit向量指令增加到256bit的向量指令。作为Sandybridge架构中的一个重要属性,AVX指令集可以大幅提升处理器的浮点运算功能,或许也能成为不同硬件逻辑融合的接口。
今后一段时间内,CPU+GPU的异构计算结构将引领处理器的发展方向,这也成为下一代超级计算的发展方向,而融合还需要不断改进和成熟。目前设计GPU+CPU架构平台的指导思想是:让CPU的更多资源用于缓存,GPU的更多资源用于数据计算。把两者放在一起,不但可以减小在传输带宽上的花销,还可以让CPU和GPU这两个PC中运算速度最快的部件互为辅助。
在文章末尾特别感谢艾维硕科技媒体公关经理,朱亮先生。从我策划这篇文章开始,他就为本文提供了重要的参考资料支持,文中有很多准确辅助内容的配图正是来自这些资料。
本文参考与引用文献:
[1] 《定分止争-细研GPU架构流程工作原理》
[2] 《高性能运算之CUDA》 第一章 GPU通用计算
[3] 《高性能并行计算》 并行计算机发展历程
[4] 《Introduction to Parallel Computing》What is Parallel Computing
[5] 《Introduction to Parallel Computing》Flynn's Classical Taxonomy
[6] 《流处理器缘何差6倍 A/N GPU架构解析》
[7] 《ATI Radeon™ HD 5800 Series Graphics》
[8] 《图形硬件与GPU体系结构》
[9] 《DirectX支配游戏 历代GPU架构全解析》
[10] 《GPUs - Graphics Processing Units》Introduction
[11]《ATI Xenos: XBOX360 GPU》
[12]《GPU精粹2》 第29章 高性能计算的关键
[13]《GPU精粹2》 第32章 了解浮点
[14]《GPU精粹2》 第31章 把计算概念映射到GPU
[15]《ATI Stream Computing User Guide》
[16]《AMD Fusion™ Family of APUs: Enabling a Superior Immersive PC Experience》
[17]《基于图形处理器(GPU)的通用计算》
[18]《GPU Computing: Past, Present and Future with ATI Stream Technology》
[19]《Havok FX Next Gen Physics on ATI GPUs》
[20]《通用计算核动力:OpenCL技术解析》
[21]《GPU精粹3》 第31章 使用CUDA进行快速N-body仿真
[22]《GPU精粹3》 第35章 使用GPU进行病毒特征的快速匹配
[23]《GPU精粹3》 第37章 使用CUDA进行高效的随机数生成及应用
濮元恺所写过的技术分析类文章索引(持续更新) | |
7、 显卡只能玩游戏? 10年GPU通用计算回顾 | |
2、改变翻天覆地 最全Fermi架构解读 | |
3、从裸奔到全身武装 CPU功能集成之路探秘 | |
4、AMD统一渲染架构 历程回顾与评测 | |
6、别浪费你的电脑 分布式计算在中国 | 12、Computex独家泄密 解析AMD下代GPU |