走进GPU通用计算的世界——专访NVIDIA亚太区技术市场经理邓培智

来源:百度文库 编辑:神马文学网 时间:2024/04/29 19:01:15
发表时间:2008-03-12
CUDA是基于GPU进行通用计算的开发平台,非常适合于大规模的并行数据计算。邓培智先生介绍了CUDA的技术原理、组成部分以及未来的发展
CUDA是基于GPU进行通用计算的开发平台,非常适合于大规模的并行数据计算。邓培智先生介绍了CUDA的技术原理、组成部分以及未来的发展。
邓培智先生从2002年开始加入NVIDIA公司,主要负责市场部技术相关业务。2006年11月NVIDIA推出的CUDA开发平台,将目前业界最领先的GPU的应用由图形计算领域推向了通用计算领域。我们认为GPU和相关开发领域的发展会为未来的数据计算开发带来深远的影响,让我们来听听邓培智先生是如何看待GPGPU和CUDA的。
Q:CUDA和GPGPU在概念上有何不同?
A:GPGPU其实是一个比较宽泛的概念,它的计算还是通过API送入GPU的。传统的GPGPU应用往往要了解OpenGL编程或者DirectX编程;而现在基于CUDA平台,如果你的应用不涉及OpenGL或者DirectX的话就可以不用理会那些API。换句话说,以前的GPGPU进行通用计算是通过把这些问题转换成为图形计算送到GPU中完成的,而现在基于CUDA则可以直接调用GPU的计算资源,成为高性能计算的软件开发环境。
Q:CUDA是面向什么样的人群的?能够解决什么问题?
A:简单地讲,CUDA是用于GPU计算的开发环境,其核心则是一个C的编译器。CUDA对于非图形的计算并没有什么限制,不过它还是相对比较适合高度并行的计算,毕竟这是它的长处。我们讲高度并行,也就是说同时运行相当多个线程。相对于CPU来讲,双核的CPU也许几个线程就能充满它整个的计算单元,然而CUDA-enabled GPU却能够容纳上千个线程。所以常遇到的高性能计算领域的问题就特别适用于CUDA,而之前我们也许只能使用集群的方式来进行计算。
Q:听起来很不错!那基于CUDA的GPGPU应用能够完成通常意义上的所有计算吗?
A:是这样的,就像我们刚才说的那样,CUDA还是主要去做那些能够分成很多个独立线程的数值计算。比如说矩阵的乘法计算,矩阵相对应的元素的计算是没有什么联系的,可以很多个线程同时送入很多个处理器进行并行处理,这就非常适合于用CUDA来解决。当然并不是所有的事情CUDA都能够很好地解决,比如像操作系统这样复杂的指令和纷繁的分支循环而又用很少的线程来处理,这显然就不是CUDA的强项了。高度并行的计算是CUDA的技术特性之一。
Q:现在的GPU发展很快,最新的GPU已经有128内核集成在一起?
A:事实上是这样的,与其叫做是128个内核,不如说是128个流处理器(stream processor)更合适。这里面每一个stream processor每个时钟都能够进行一次乘加。当然GPU里面还有很多其他的部分,也都是可以参与计算的。
Q:我们都知道,以前的GPU是不能处理类似于逻辑控制的指令的?现在的GPU芯片的发展情况是如何的呢?
A:现在是完全可以的。其实从我们的GeForce6一代开始,就能够支持比较复杂的控制指令,比如条件转移、分支、循环和子程序调用等。而到了GeForce8这一代,我们的程序控制能力又增强了很多,支持的程序长度也得到了更大的扩展,也就是说利用GPU还是可以写一些比较复杂的程序。
Q:GPU里面包含的128个stream processor的计算能力跟CPU相比如何呢?
A:其实,GPU的stream processor个数是不能和CPU现在拥有的内核数量作类比的。CPU的每一个核心都是一个完整的CPU,而GPU中的每个stream processor并不完全是这样,它有一个组织方式,比如每8个stream processor组成一个Stream Multiprocessors (SM),每两个SM组成一个PTC。而指令的执行,我们GPU计算是基于线程的,每几十个线程组成一个我们叫做warps,这些线程在每个warps里面都工作在SIMD(单指令多数据)的方式。
Q:GPU中谈的线程和CPU中的线程似乎有些不太一样,区别在哪里呢?
A:GPU中的线程是一种非常轻量级的线程,创建线程的开销非常小,比如说一个顶点计算中要做一个两个矩阵的乘法运算,每个元素的相乘操作都会作为一个线程的任务提交到GPU中。而CPU中的线程所做的就比这个要多得多了,除了数据计算还可能会包含大量逻辑控制方面的指令。
Q:CUDA已经发布了1.1版本吗?相对于1.0有什么变化?
A:对。主要是做了一些小的升级,改变了对C语言的支持的改进,增加了对新的指令和格式的支持等等,功能上没有什么太大的变化。不久也将会发布一个GPU的Debugger,以后将会支持新的C语言的版本,现在是支持到VC7.1和VC8.0,也就是Visual Studio .Net和Visual Studio 2005,以后会支持Visual Studio 2008,还会增加对Vista的支持,值得一提的是,今年会增加对双精度的支持。而且CUDA的驱动程序也整合到了显卡的驱动程序里面。
Q:所谓的支持这些开发环境,指的是CUDA的编译器nvcc可以和这些开发环境联立起来编译项目?
A:对,你说的很对,就是指编译器能够和VC协同工作。实际上我们的编译器nvcc会把CPU code和GPU code分开,CPU code还需要使用传统的编译器编译,而GPU code就能通过nvcc编译成GPU的代码。
Q:如果开发人员想建立一个CUDA的开发环境,只能使用NVIDIA的GPU吗?
A:对,现在来看是这样的。因为其他公司的GPU的架构我们也不清楚,而且也不一定适应大规模的计算。我们NVIDIA的GPU考虑到要进行计算,每一个stream processor都采用标量架构,而有的公司则是使用矢量计算,可能在效率上会存在一些问题;再说CUDA的运行需要显卡驱动的支持,我们也不可能要求其他厂商的驱动支持我们的CUDA。
退一步说,我们的显卡市场占有率还是比较高的,大致在60%左右,所以应该造成的影响不会太大。况且CUDA都使用在中高端领域,而在中高端市场我们则有更高的市场占有率,绝大部分的用户都在使用NVIDIA的GPU,所以绝大部分的用户都可以使用CUDA。
Q:从已经实现的案例中,CUDA通常都应用在哪些领域呢?
A:从高层的应用角度分析,那就很多了。比如有限元的计算、神经元的研究计算、地质分析等等科学研究的领域;比如游戏中的物理模拟等问题。当然目前GPU计算的应用还是处于一个早期的阶段,大部分CUDA应用都是专业人员和相关的程序员在开发,我们希望以后会有实际的基于CUDA的程序,更多的程序员能够加入进来,并且开发一些可以给大家日常应用带来好处的程序,只要有支持CUDA的GPU就能够利用到GPU计算的好处。
Q:把现有的软件,当然都是使用CPU计算的,移植到CUDA平台使用GPU的计算能力来加速的话需要多大的工作量?
A:这个就要看情况了。如果说以前在单个CPU上跑的应用,可能在并行性上没有太多的考虑,要想使用CUDA来利用GPU计算的资源,就要改写程序中的计算部分,以便于更好地利用GPU的能力,毕竟CUDA非常适用于大规模的高度并行的高性能计算。所以最好还是在程序一开始编写的时候就用CUDA这种模式编写,如果移植以前的程序可能还是会涉及到很多其他的问题。
Q:你认为很多初次接触CUDA的人对于CUDA是否会有一些理解有误的地方?
A:这是个好问题,显然他们在这里存在几个常见的误解。
第一,可能有人认为“有了GPU之后CPU就不需要了”,显然GPU和CPU还是做不同的工作的,GPU的计算主要集中在高效率低成本的高性能并行计算;
第二,有人觉得“有GPU做计算CPU就不需要很强大”,但事实上在一个系统里面,一个高效的GPU配合一个高效的CPU,整体的效率还是会有明显提升的,这些都是明显的误解;
第三,也许不叫误解,应该是更多的人对于CUDA的应用范围不是很了解。其实说穿了,CUDA适合于并行计算,大规模的并行计算,成千上万的线程的并行计算。
source: http://cuda.csdn.net/News.aspx?id=a5659c28-9b8b-4815-8930-496e06ca439c