经过多年的尝试,图形处理单元(GPU)开始受到主流服务器厂商的重视,戴尔和IBM是第一批在高性能计算机(HPC)上采用GPU的一线服务器厂商。GPU通常用在桌面PC上,主要作为电子游戏的高速图形加速器,但服务器厂商很快发现它除了在游戏渲染方面有出色的表现外,在数学计算方面也有先天性优势。
今年5月,IBM宣布计划为iDataPlex dx360 M3可横向扩展服务器提供一对Tesla M2050 GPU,戴尔也不甘落后,于6月宣布PowerEdge M610x刀片服务器将会装配一对Tesla M2050 GPU,M610x装配了英特尔至强5500或5600处理器,最大可以提供400亿次/s的计算能力。
在这些服务器厂商竞相重视GPU计算的背后,Nvidia(英伟达)是最大的赢家,都说早起的鸟儿有食吃,Nvidia在推动GPU作为数数学密集型计算任务处理单元方面已经持续了很长时间,但直到戴尔和IBM宣布集成Tesla M2050 GPU之前,Nvidia一直未获得一线服务器厂商的支持。
GPU历史
如果你对PC的发展历史比较了解,你一定还记得8086,80286和80386处理器中就具有数学协处理器了,分别是8087,80287和80387,如果你在20世纪80年代后期购买过PC做数学或科学计算,PC销售人员应该给你讲过数学协处理器,这些附加的芯片是专为快速,准确的计算而设计的,主要买家是电子表格用户,因为那时Lotus 1-2-3是x86上的杀手级应用,安装数学协处理器后计算速度会更快。
到80486时,数学协处理器就集成到CPU了,随后的处理器架构不断增加指令加快数学计算速度,到了今天,CPU设计文档称之为“浮点单元”,因为数学计算主要就是浮点运算。
计算机只会将数字看作是整数或浮点数,整数没有小数位(如13人),而浮点数有小数位(如3.14159),细粒度计算都是浮点单元的工作。
这对于图形来说特别重要,因为计算构成一个平滑三维图像的三角形位置需要非常精确的分数,多或少一点三角形就会开裂,破坏图像的整体效果,图形处理软件需要计算30位小数获得精确的拟合,颜色和亮度。
多核数学处理器
多年来,Nvidia和它的竞争对手ATI(2006年AMD收购了ATI)已经生产过大量的多核数学处理器,有意思的英特尔和AMD制造的CPU大多还是4-6核,而Nvidia最新的Fermi架构具有483个流处理器(当然也会消耗更多的电力,产生更多的热量),而ATI Radeon 5000系列更是达到了1600个流处理器。
流处理主要用于并行处理计算单元,靠软件管理内存分配,数据同步和通信等,这些核心通过高速连接通道连接。
GPU线程比CPU线程更小,因为它们只包含了一堆数学指令,通常,数学指令会被简单地视为加法,GPU可以更快地切换线程,因为核心可以在一个时钟周期内从一个线程转到另一个线程,而某些CPU是办不到的,CPU线程是一系列复杂的指令组成的,如系统进程或操作系统调用。
最近,需要高性能计算的人们已经意识到那些483到1600个数学核心除了渲染游戏外,可能还可以做点别的什么,Nvidia和AMD当然举双手赞成,最近它们也增强了GPU中的数学协处理器。
最后要提到的是双精度浮点运算,它是复杂科学计算所必需的,Nvidia和ATI也都已经将双精度浮点运算加入到它们的芯片中去了,单精度浮点数是32位长度(2^32),而双精度浮点数是64位长度(2^64),这个与游戏毫不相干,但科学研究却离不开它,如全球气候模拟科学实验。
GPU编程
如果你数据中心的服务器有GPU,那么在编写服务器应用程序时就应该将其考虑进去,但利用GPU不是一个简单的任务,需要在CPU和GPU之间做好协调,不是引用几个现成的库,写几行代码就可以搞定的。
电子游戏是大量使用浮点运算的很好示例,但游戏并非浮点运算的唯一用途,凡是与可视化相关的领域几乎都会牵扯到浮点运算,如医学成像,三维成像,科学成像,石油和天然气勘探可视化,娱乐,广告和金融建模等。
这个过程被称为GPGPU计算,或通用GPU计算,需要通过编程将本该由CPU处理的计算任任务交由GPU处理,很多时候,这意味着要重写代码,Nvidia使用CUDA开发语言来处理。
CUDA是一种类似于C的编程语言,用它可以开发在Nvidia GPU上并行运行的应用程序,与x86处理器不一样,应用程序不只并行运行2,4或8个线程,而是数百个线程。
Nvidia的付出也得到了回报,现在全世界有超过350所大学已经开设了CUDA开发课程,但如果只有Nvidia一家公司有这个干劲,最终也可能是徒劳的。
OpenCL项目是OpenGL的一个分支,它为3D显卡提供了一个图形库(在很大程度上可以取代微软的DirectX),苹果公司是OpenCL框架的创立者,OpenCL框架用于编写跨CPU、GPU和其它处理器执行的程序,OpenCL包括一个编写内核和API的语言,它们可用于基于任务和基于数据的并行编程。
OpenCL与CUDA相比有优势也有弱点,首先,它支持多处理器计算,而CUDA只支持Nvidia GPU;OpenCL可以让任何应用程序访问GPU,且不用重写代码,而CUDA必须用C为Nvidia GPU重写代码;OpenCL支持任何输入/输出处理器,因此它也支持安腾、Sun UltraSparc和ARM嵌入式处理器。
OpenCL框架比CUDA技术更新,因此缺少很多CUDA具有的特性,也没有CUDA成熟,最值得注意的是,CUDA拥有快速傅里叶变换内核(FFT),但OpenCL没有,FFT算法是一个复杂的算法,在高级科学计算和图像处理领域有着广泛的应用。
这两个框架都有各自的优缺点,CUDA凭借Nvidia的强力支撑已经占领了绝大多数市场,而OpenCL也不弱,它由标准化组织管理,但从目前来看还是一事无成,我们是将自己绑定到Nvidia还是等待标准更新?有点举棋不定。
除了CUDA和OpenCL外,还有第三个竞争对手,那就是微软的DirectCompute,DirectCompute是DirectX 11 API库中的一个组件,我们在Windows 7中可以找到它,和OpenCL一样,它可以让应用程序使用GPU的计算能力。由于它仅在DirectX 11中,因此使用DirectCompute有些限制,首先,它只能运行在Windows 7计算机上,因为微软没有为其它系统准备DirectX,市场上也没有那么多DirectX 11显卡,ATI现在处于领先地位,但Nvidia也正努力追赶,目前,DirectCompute还未被服务器厂商正式利用。
应用模式
那么谁最适合GPU计算?正如前文所述,高级数学运算是一种情况,还有医学研究中的疾病逆向工程,医学成像中的超声图像渲染,以及视频和图像处理领域,如电影特效制作。
Nvidia最近可谓风光极了,在2010奥斯卡奖项中,三部最佳特效电影(星际旅行,阿凡达和第9区)都离不开Nvidia的功劳,因为它们都使用了Nvidia GPU进行渲染。在商业领域,Nvidia GPU也被广泛用于能源研究,石油和天然气储量探测计算,以及股市趋势分析。
但你的数据中心并不一定需要GPU,因此不要认为下一次购买服务器就一定要买集成GPU的,对于基本的服务器任务,如文件服务,网页服务或数据库服务,GPU是帮不上忙的,对于I/O密集型应用,如应用程序服务器或数据库服务器,也是不需要GPU的,它们需要的是大内存,高速连接,或是固态存储,但都与GPU无关。
使用GPU涉及到编程,这也是目前新兴的一种编程类型,想进入这一行的开发人员应该接受专业的培训和教育,但不一定要参加硬件公司的培训,但诸如Nvidia和AMD提供的培训可能更扎实,但不一定适合企业级开发。