技术开发 频道

大规模并行计算一定会成为趋势

  如何理解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配合使用。

  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瓦。
 

0
相关文章