大规模并行计算一定会成为趋势
但是,随着制造工艺技术的制约以及CPU架构本身设计目标的局限,这种时钟频率的提升很快就碰到了壁垒。从2001年至2003年,Pentium 4处理器的时钟频率从最初的1.5GHz提升到了3GHz。然而从2003年到2005年,整整2年的时间里,处理器的时钟频率提升的速度骤然放缓,只是从3GHz增加到3.8GHz。处理器的速度增长宛若已经到了强弩之末。
尽管如此,Intel等处理器厂商仍然不肯放弃。他们充分的优化了处理器的架构,使之可以运行在更高的频率上,Prescott核心就是这种造神运动的产物。不过Intel所面对的问题已不仅仅是工业制造技术的问题,而是最简单最基本的物理定律的壁垒,关于摩尔定律从此失效的言论也甚嚣尘上。
GPU计算能力的使用,以及GPU在通用计算领域表现出来的能力,注定会成为芯片计算历史的拐点,通用GPU仿佛成了天将降大任的角色。在GPGPU一路高歌猛进的过程作,NVIDIA公司凭借其cuda架构,站到了这个历史舞台上。
Cuda能否改变企业计算的格局?CUDA程序究竟如何编写?CUDA架构是怎样的?……带着对cuda架构的种种疑问,IT168技术开发频道记者专访了NVIDIA公司亚太区技术市场经理邓培智先生。
Cuda的最终目的是简化GPU计算的编程
CUDA的根本目的就是简化GPU计算的编程,使得人们更为快捷地开发基于GPU计算的应用。 邓培智谈到,历史上来看,GPU从计算角度来说,性能提升比CPU性能提升快很多。GPU计算能力这么强,除了做图形处理之外,很多人还打算利用GPU强有力的计算能力进行其他应用,就是通用计算。尽管传统意义上的通用用途的GPU(GPGPU)能够参与通用计算和处理,但使用GPU计算很麻烦,过去的GPU完全是为图形进行设计的,它是一个非常专用的处理器,你要使用GPU 来做计算的话,你需要透过图形API进行,通过这种图形的API来访问GPU计算核心,你必须要把你的计算所需要的数据,通过API假设这种计算是3D的计算,然后你要走过一遍图形处理过程,才能得到计算结果。第一,编程非常复杂,第二,效率也不会达到很高。因为中间必须要走过渲染的过程。
“但是对于真正需要并行计算的人,比如说科学家,不可能让他们再学习图形编程的技术,普通开发者大部分也没有图形编程的经验。在这种情况下,NVIDIA认为可以把并行计算和图形结合起来,所以就催生和开发了CUDA。”
据了解,CUDA的项目和NVIDIA的GeForce 8系列架构的开发时间差不多。NVIDIA GeForce8系列是花了4年多时间开发,CUDA也是那个时候开发的。NVIDIA GeForce 8 GPU开发的时候就考虑到了图形和并行计算两方面的需求。所以NVIDIA GeForce 8800系列发布的时候就宣布了CUDA,这是一种全新的GPU计算开发环境。
CUDA对于行业的价值
低成本地拥有高性能服务器
邓培智谈认为,cuda相对于传统的服务器集群以及超级计算机在性价比、占地空间、功耗等方面的优势非常明显。CUDA对于行业的价值,通过CUDA和支持CUDA GPU,两者结合在一起,所有的厂商很容易利用GPU强大的计算能力做各种各样的并行计算工作,这就是最大的价值。这一切使得每个人都可以低成本的拥有自己的桌面超级计算机成为可能,而不是大家来共享一台大型的超级计算机。正如NVIDIA Tesla GPU 计算事业部高级产品经理Sumit Gupta所言,这不是简单的芯片的性能提升,而是带来了一种全新的、具有革命性的计算模式。
如何理解CUDA软硬件架构
邓培智: CUDA是专门针对GPU来进行编程的平台,它最大的特点是,CUDA如果在GPU计算方面来说,是所谓的异构计算系统。它和CPU有很大的不同。CPU我们只是针对一个处理器编程,CUDA是针对GPU计算得的,但是它包含GPU和CPU两部分的代码。顺序计算和一些数据的管理等等代码在CPU上运行,而核心的并行计算部分在GPU上运行。在编辑的时候编译器会把CPU代码和GPU代码分开,GPU代码会被编译成成GPU的目标代码,CPU代码还是需要其他的C语言编译系统来编译(最新的CUDA版本也支持多核CPU)。这可能是最大的不同。CUDA一定是需要CPU来参与的,我们叫异构计算环节。所谓异构计算,就是CPU和GPU两个架构和指令集都是不一样的,但是他们共同协同动作来解决同一个问题。 至于说CUDA和DirectX/OpenGL这些3D API的关系,对于CUDA来说,是不需要3D API的,但是CUDA可以很容易和3D API配合使用。 #p#page_title#e#
Cuda软件架构图
邓培智针对这个CUDA的软件架构图进行了讲解, CUDA提供了两种不同类型的API接口:一种是高级的API:CUDA运行的API,另一种是低级API:CUDA的驱动API。
高级的API是在低级API之上所执行的,每一个调用的函数在运行的时候都可以被驱动API细分为若干个基本的指令。
驱动API结合了更多的管理功能,它会请求GPU做很多处理工作。但它的好处是更加的灵活,它可以给程序员更多额外的控制。无论如何,这两种API都可以沟通OpenGL和Direct3D的资源。
CUDA的软件层,目前CUDA的2.0版提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。
CUBLAS是一套函数库,它是基于模块化的运行在GPU上的线性计算函数库。它支持NVIDIA的GPU的计算资源。该库在API层次上是能够“自给自足”,即不必与CUDA直接交互。应用程序使用CUBLAS库的基本模型是在GPU内存空间中创建矩阵和矢量对象,使用数据填充它们,调用一定顺序的CUBLAS函数,最后把结果从GPU内存上载到主机。要实现这个过程,CUBLAS提供了一些帮助函数,用于在GPU空间中创建和销毁对象,以及对这些对象写入和读出数据。
对于CUDA内部的线程管理原理,邓培智也进行了相应的介绍。GPU线程是非常轻量的,也就是说的创建和线程的切换,基本不需要系统开销,线程的创建、撤销和切换几乎是立刻的。这个和我们硬件设计是分不开的。 CPU的程序多线程的创建和注销有很多代码。这个和CPU程序的线程不太一样。比如即使是四核CPU,如果跑非常多线程的话,线程的管理就会成为严重的负担。GPU计算的话里面怕你线程不够多,你需要上千个甚至上万个线程才可以把GPU填满,这是非常大的不同。 所以我们认为大规模的并行计算特别适用于CUDA的这种架构。
在硬件方面,包含cuda架构的显卡已经有多款产品,传统的OEM厂商会将Tesla产品整合在他们提供的解决方案中,除此以外,NVIDIA也有自己专门的CUDA计算平台解决方案,如Telsa S1070 1U机架服务器,共有4个GPU卡,共960个内核,性能达到4万亿次每秒,功耗只有700瓦,而如果要达到相同计算性能,需要一个小服务器集群才能实现,而功耗可能达到几万瓦;另一款产品是Telsa C1060,可以用到普通的PC和工作站中,性能是957Gflops,功耗只有160瓦。
目前,适合于并行计算的应用已经越来越多。据邓培智介绍,很多在CPU上面做的应用,比如说视频编码,它的效率非常低。比如说H.264的视频编码,把代码转移到CUDA上面以后,它的性能比在CPU上快十几倍,这是非常典型的应用。还有很多这方面的应用,都可以使用CUDA对它进行加速。这样对于普通用户来说,他也可以从CUDA里面得到好处。H264编码强度很高,一是它的编码效率很高,你相同的码率,它可以获得更好的品质。二是它需要更多的计算,在这个情况下,过去要用CPU实现实时H264的编码是很难的,现在使用CUDA可以加快编码的过程。像IPOD支持H264的格式,你要把一张DVD转换为这个格式,用CPU来做,需要很多小时,用CUDA来做,半个小时时间就可以把DVD转换完。 另外还有一个就是物理加速,我们使用CUDA,GPU通过PhysX物理引擎对物理效果加速,你除了可以看见比较逼真场景以外,你可以让场景真正逼真地动起来,战争中爆炸的场面,人物的衣服动起来非常逼真,现在这个叫动态逼真,以前叫静态逼真。所谓静态逼真就是你游戏中截图都很逼真,但是动起来就不太像了,显得比较假。有了物理加速引擎就可以获得动态逼真,很多东西动起来都很像,包括水流、烟雾等等,这个需要物理的加速。物理的加速如果仅仅靠CPU来做,是非常难的,使用GPU你可以做大规模的物理的模拟,在游戏里面让游戏变得非常栩栩如生。 我们马上会推出很多支持物理加速的游戏,现在有的游戏已经直接用了,我们会有更多的游戏推出来。让大家感受到这种不一样的效果。 当然还有其他的应用,包括图象方面的应用,还有视频方面的应用,还在继续开发,我们希望不久以后有很多GPU计算方面的应用不断的开发出来。 #p#page_title#e#
另外的可能的应用还有类似像病毒文件的扫描,因为这个也是非常典型的、非常大的数据量,需要很大的处理能力,金融里面也有很多的处理,包括数据库的搜索和数据分析,很多在CUDA上面都可以获得很好的加速效果。
对于许多企业计算领域,GPU计算甚至超过了传统的计算机,让许多原来无法解决的问题现在可以通过GPU计算机来轻松实现。比如,针对新型流行性疾病如非典禽流感等,人们总是希望新药物研制的时间越短越好;在天气预报方面,人们希望预报的精度和准确度越高越好;在金融股票价格分析方面,人们在决定买卖股票时总是希望越快越好。GPU计算的出现,使得超级计算机在挑战这些领域极限方面又进了一步。比如,美国国家癌症研究所通过GPU计算将模拟速度提升了12倍,等待结果的时间从原来的2个小时缩短到了10分钟;美国国家大气研究中心的气象研究和预报模型(WRF)尽管仅仅将1%通过CUDA来实现,但其总体速度却提升了20%,节省了一个星期的分析时间;在评估整个美国期权市场时,Hanweck原来计划用价值26.2万美元的600 CPU集群来处理,而实际采用三台nvidia Telsa S870后,机架空间节省了9倍,硬件成本节省了6倍。这就是GPU加速带来的魅力!
CUDA编程并不难,难在并行计算本身
很多人认为,学习CUDA编程很难,其实并不是这样,邓培智谈到。一个C语言编程者几乎2天就能学会简单的CUDA编程的基本语法和方法,难度还在并行计算本身。比如,我们该如何判断,哪些应用是可以并行化的,该如何切分任务等等这些并行计算本身的问题。
其实CUDA的语法很简单,实际上就是一个标准的C语言的扩展,必须有扩展来支持GPU的运行代码,必须有一些新的函数等东西。但是如果一个程序员会C语言,会很容易用CUDA编出第一个程序,但是难就难在解决工作中的问题,用CUDA迅速的解决。这个问题不是在于CUDA本身,而是你要把这个问题并行化进行高效处理得问题,可以说这个是并行计算的普遍性的问题。如果要使用别的并行计算方式,这些问题也同样存在的。 从语言本身来说,CUDA没有什么特别难的地方。如果你对你所开发的东西,如果有很深的了解,要转换起来很快,就像PhysX,它原来是是AGEIA开发的一个物理引擎,我们收购它以后,工程师一个月内就可以把软件移植到CUDA新的平台上运行起来了,PhysX是个相当复杂的程序,从这个指令转换到一个完全不同的架构上,这是需要很大的工作量。这个例子说明什么呢?说明只要你对你的工作有足够的了解,就可以很快的移植到CUDA架构上面来,CUDA还是很容易学习的。
邓培智,“我希望开发者对CUDA的算法进一步的了解,看能不能把我的计算并行化。这些确实需要技巧,我相信在某些情况下这不是非常容易的事情,需要开发者去判断。但有些地方是很容易看,比如说带有连续的逻辑性,一步一步来,这个很难进行大规模的并行化。但是有些地方很容易并行化,因为需要很多数据可以并行来处理,也没有太多的数据相关情况。但是很多的情况都是有一定难度,这个需要开发者掌握一些技巧。CUDA入门很容易,但是进去对各种问题进行高效率求解,就需要有很多技巧。 这方面我了解到的国内的情况来看,对并行编程特别熟悉,或者特别有经验的开发者总的数量不见得是特别多。当然这跟国内大部分人的开发环境有关系。这个和过去大家很多人可能没有机会用到常规的大规模并行运算的计算机(比如说巨型机,它也是几千的GPU)有关,大多数人接触到的是PC机。在PC机上开发,是和并行计算开发的思维方式完全不一样的。我觉得这个需要去培养并行的思维方式,和并行编程的习惯,如果编程人员对这方面的了解和经验多了,CUDA编程所带来的回报是非常大的,这也是真正对并行编程的人有经验的那些用户往往对CUDA报有极大的信心的原因。归根结底,很多问题其实都是并行编程本身的问题,而不是CUDA的问题。” #p#page_title#e#
并行计算一定会成为趋势 CPU和GPU会长期共存 多核的优势值得怀疑
关于目前流行于业界的一些争论和观点,邓先生也给出了自己的见解。从效率和成本两方面看,并行计算一定会成为趋势,会成为下一代应用开发人员的一种思维方式。
邓培智说,“对于NVIDIA来说,或者对于业界来说,我们看到这种趋势,大家认识到,在PC的平台上,或者在个人计算平台上,需要有更强的并行计算能力,需要GPU来承担更多的工作,这是一种很明显的趋势。很多公司都已经认识到这种趋势。比如说苹果公司,苹果是所有公司里面最注重个人体验的一家公司,这个每个人都承认。他们就认为GPU将会在在个人体验起到最重要的作用。他们非常重视GPU的计算资源。GPU的计算资源非常高,你不充分用起来,确实是很大的浪费。”
关于CPU和GPU之争的问题,邓培智再次强调,这2种计算模式一定会长期存在。这是由他们的设计目前和主要任务所决定的,一方取代另一方,短期内都是不大可能的。
邓培智介绍道,现在的CPU最重要的设计原则其实是要能更快的执行各种指令,现在很多程序的结构设计非常复杂,这些指令有非常复杂的逻辑,分支、条件的转移等很多,你要非常高效的来执行,你需要设立很大的缓存,你还需要在指令执行上做很多的工作,比如说需要很大的指令缓冲池,对指令进行分析,需要乱序执行,把顺序打乱以后,没有数据或者存储相关的先执行,有相关的后执行等等,这就导致每个CPU的core很大,其中真正负责计算的占的面积是很小的,大部分晶体管消耗在指令执行环节,计算方面能力相对就弱些。要高效运行现有的很多程序,这样的设计也是必须的。而GPU的核心就是计算,运行计算,我们的GPU有很多个核,128甚至240核,这么高的并行度就是要尽可能做到计算吞吐量足够得大,但是GPU的每个核不可能作得像CPU的核这么复杂。这两个设计理念就有很大的区别。我不相信把这两个很快的统一。因为从架构设计的目标来看,就是有很大的矛盾。在现有的工艺条件下你很难一个架构两边都做好。
针对高性能应用是选择多核方式还是GPU并行计算的方式的问题,邓培智认为目前CPU多核的优势是值得怀疑的,而GPU带来的优势会立竿见影。
邓培智:“ 但是从某种意义上来说,你要看你的应用是什么?说老实话,多核从用户应用来讲,优势体现在哪里呢?不管是在游戏,还是在浏览,或者做其他方面,四核和双核比起来,没有特别明显的优势体现出来。比如说你有一个四核,你可以自己想象一下,哪些应用程序真正能够充分应用到四核功能,实际上是很少的。对于GPU来说,这个是不太一样,GPU除了做图形处理,还可以做其他方面的处理,真正四核应用有优势的地方,往往也是使用GPU来做更具效率的地方,比如说视频的编码,四核比双核块,或者是图形渲染四核相比双核可以提高很高的性能,雷外还有像物理加速,刚才我说的游戏里面的物理加速,四核比双核快,但是在所有这些领域里面如果使用GPU的话,会比四核快很多倍!”
我们都知道,未来的IT领域肯定是并行计算的天下。无论是硬件、软件都会朝着这个方向发展,这是业内技术的大趋势。尽管如此, NVIDIA仍有诸多机遇和挑战。虽然在技术方面CUDA有许多先天的优势,但是想要说服系统平台开发商,和习惯了传统编程思维习惯的,崇尚兼容性,稳定性为首要素的软件开发人员来支持CUDA也不是一件容易的事儿。
在人类计算历史的长河中,各种新技术肯定会风起云涌,你方唱罢我登场,NVIDIA的CUDA架构和技术,已经被义无反顾地推到了历史的舞台上,至于它究竟能够走多远,是否能够上演更精彩的故事,也许一切只有等待时间的检验。