NVIDIA欲做行业的领袖和标准的制定者

GPU 专栏收录该内容
1 篇文章 0 订阅

NVIDIA欲做行业的领袖和标准的制定者

近些年来,虽然CPU方面的发展脚步并没有停歇,不过面对日益庞大的并行计算项目还是显得有些力不从心。即使是能够通过大批量多CPU并联从而实现高速计算,但是这样以来整体造价成本也就非常高昂。而NVIDIA在近两年来逐渐成长起来的CUDA则很好的解决了这一问题。

2008年11月26日 - 夢見島物語 - 君がいる限り

◆协助CPU,实现更快速的并行计算:

众所周之,CPU与GPU之间虽然各司其职,但是内部关系却非常紧密,在一个完整的PC平台 当中二者缺一不可。CPU就好像一个全能型选手,虽然各个领域都能够应对,但是没有一个非常专长的项目;而GPU则不同,虽然在技术方面不如CPU那样全 能,但是在单一领域当中却是技术出众。两者在整个PC系统当中,各有所长、取长补短。不过在原有的PC系统中,GPU往往仅仅担当了3D图形处理的任务, 而其出色的并行处理能力在非3D图形处理情况下则完全浪费掉了。

究其原因在于,CPU的微架构是按照兼顾“指令并行执行”和“数据并行运算”的思路而设计, 就是要兼顾程序执行和数据运算的并行性、通用性以及它们的平衡性;而GPU的设计初衷则完全不同,GPU为了能够达到同类型数据的更快速的密集运算,因此 往往被设计有更多的重复计算单元。这就决定了CPU和GPU的运算方式以及运算能力的差别,CPU更加适合复杂的数据运算,而GPU则更加适合大量简单的 并行运算。

而GPU今年来的发展也如同CPU甚至超越了CPU的发展速度,它们的并行运算能力也得到了飞跃式的发展。正是出于这样的原因,GPGPU这个概念才得以诞生。GPGPU并非是抛开CPU独立的部分,而是一个辅助CPU进行并行计算的模块。

那么,如何使得CPU与GPU之间很好的进行程序之间的衔接呢?以GPGPU的概念来看,显 卡仍然需要以传统的DirectX和OpenGL这样的API来实现,对于编程人员来说,这样的方法非常繁琐,而CUDA正是以GPGPU这个概念衍生而 来的新的应用程序接口,不过CUDA则提供了一个更加简便的方案——C语言。

◆新标准的定制者——NVIDIA

CUDA的诞生,可以说是NVIDIA为GPGPU或者说显卡参与并行运算行业定制的一个新标准。同时,目前CUDA也成为了同行业当中的一个领袖。CUDA能够更好的让GPU资源得到利用,而CUDA这个新的类似于API的接口正是NVIDIA为其量身定制的新标准。

对于软件开发者来说,他们可以通过CUDA这个接口使用C语言便可轻松实现对GPU资源的调 用。这个新的标准将会在未来更多的被软件开发人员所利用,从而为用户带来越来越多的基于CUDA技术而开发的应用程序软件。这些软件将会覆盖到多媒体、航 空航天、建筑、医学、科学计算等等众多的应用领域。今天,我们就从GPGPU开始谈起,看看CUDA是如何实现大规模的并行计算的。

GPU功能已日渐强大 通用计算势在必行

在传统的发展路线中,电脑显示卡一直在为游戏和3D应用程序服务,但是竞争的激烈、技术的飞速前进客观的成就了GPU的爆炸式发展。GPU的运算能力已经达到了非常高的水平,甚至在浮点运算能力上已经大幅度超越最高级别的处理器产品。

研究表明,从1993年开始,GPU的性能以每年2.8倍的速度增长,这个数字大大超过了 PC其他子系统的发展速度。一块工作频率为3.0GHz的Pentium 4处理器,其晶体管数目为1.25亿个,即使算上SSE指令集的SIMD(单指令并发多数据流,这种情况是浮点吞运算下吐能力的最理想状况),也只有 6GFlops的峰值浮点处理能力,而同期的一块NV40 GPU就有2.22亿个晶体管,峰值浮点运算能力很轻易超过40GFlops,而时间发展的今日,GPU的峰值浮点运算能力已经接近甚至超过了 TFlops(1000GFlops)级别,GPU的性能可想而知。

除此之外,GPU还拥有自己的独立子存储系统——显存,它拥有比系统主内存高得多的带宽。 Intel曾经为它的Pentium 4 XE系列处理器所拥有的1066MHz前端总线所提供的8.6GB/S的带宽倍感自豪,而同期一块普通的GeForce 6800就拥有20GB/S以上的显存带宽。

于是,由这个问题就导致了两方面的考量:一、GPU拥有如此强大的性能,它能否为其它非游戏 类的应用程序进行加速,发挥其性能的优势;二、GPU的浮点运算能力虽然强大,但是其架构一直是专有的,无法和目前的x86处理器相比拟,通过什么方法去 使用GPU,通过什么方法去让应用程序利用GPU加速。

上述所讲就是显卡芯片厂商近两年来最新的理论构想,那就是让GPU超越游戏,去拓展更为广阔 的空间。而超越游戏,让GPU为其它应用程序服务,NVIDIA很早就进行了尝试,比如:NVIDIA早就与Adobe公司合作,为其Adobe Acrobat 8及Adobe Reader 8系列产品提供全新的页面显示着色技术,利用GPU来加速PDF格式下的绘图及显示功能,除了在效能上有所增进外,还可以利用GPU的可编程特性,进一步 加强PDF文件中的2D内容展示效果,包括平移、卷动、缩放等,实际上Adobe Reader 8每一项运用到GPU的功能都有着显著的效能增进。使用者过去避免使用的一些应用,例如可进行极精细比例缩放的地图,现在都可以轻易地显示。

而想要实现这些功能,必然需要显卡与应用程序之间有一个良好的程序接口,最早人们就是通过 GPGPU这个概念,借用传统的3D图形处理的API接口D3D或者OpenGL来实现的。不过NVIDIA提出了一个更好的方案,这就是CUDA。其时 早在G80时代,NVIDIA就提出了CUDA的概念,只不过因为那时候CUDA还未成型,所以没有公布,而现在,基于CUDA的应用程序越来越多,因此 到了GTX200系列芯片的发布,CUDA才同时正式大范围的推广并介绍给普通消费者。

纹理被计算程序装载入Shader当中,这一计算方式有其优点但也有其缺点。缺点就在于它非常高的编程复杂程度以及CPU和GPU之间较低的数据交换速度,而我们下文当中将会为大家详细介绍。

GPU辅助计算机进行并行运算在近两年来得到了非常迅猛的发展。最近一段时间,两大显卡芯片 制造商NVIDIA与AMD都推出了它们的新GPU加速平台,包括CUDA(Compute Unified Device Architecture)和CTM(Close To Metal)技术。不同于以往的图形处理技术,这两项新技术都能够抛开原有的图形接口Direct3D或者OpenGL,而直接调用GPU的硬件资源,从 这一点上来说,这要比最初的GPGPU技术更为先进。

开放性标准使得OpenGL更加具有便携性和普遍性。他们允许不同的图形芯片能够采用完全相同的代码。虽然如此,不过这种方法同样拥有它们的弊端,那就是在提高了编程的灵活性同时,他们不能使用某些显卡上的特殊功能,例如快速共享内存等。

这就是为何NVIDIA公司推出了像CUDA这样的东西,采用C语言编程,拥有自己的编译器 来实现调用GPU进行辅助并行计算的功能。当然,为图形处理器编写程序代码并非易事,这是一项非常耗费体力的工作。不过CUDA能够实现更多的功能,让程 序员更加轻松的驾驭GPU的性能。最重要的是,NVIDIA的CUDA能够支持G8x、G9x以及GT2xx系列图形核心,也就是说,只要用户或者程序员 拥有一块GeForce 8、GeForce 9或者GeForce GT200系列的显卡就可以实现。并且在最新的CUDA 2.0版本当中,还加入了双精度浮点运算功能。另外,CUDA能够支持的操作系统也更为广泛,包括了Windows XP 32/64bit、Windows VISTA 32/64bit、Linux以及MacOS的各种操作系统。

本文当中,将会以GPGPU为开端,详细介绍GPGPU以及CUDA对于并行计算的原理以及深度分析。

从底层说起,CPU、GPU并行计算的区别

虽然说CPU近些年来同样得到了迅猛的发展,不过同样逃离不了物理设计问题以及高功耗的困 扰。面对这样的问题,CPU已经开始朝向多核心的领域发展。目前市场上的CPU产品我们已经经常能够看到4核心的产品了,它们使用MIMD(多指令、多数 据)能够共同处理应用软件,并且每个核心也可以为不同的应用程序独立执行各种不同指令。

特殊向量功能( SSE2 , SSE3指令集)的四元素(单浮点精度)和双元素(双精度)向量出现在通用处理器中,是因为图形应用的增长需求摆在了首位。这就是为什么它更加适合执行 GPU的一些任务,因为它的设计初衷就是为了图形处理。举例来说,NVIDIA的芯片基于8~10核心的多处理器、数以百计的ALU、上千的寄存器以及共 享内存而设计。此外,一款绘图卡还包含高速全局显存,可以通过多核心处理器存取,同时每颗核心内还包含本地缓存以及某些确保数量连续性的特殊缓存。

最重要的是,这些核心当中的GPU是SIMD(单指令多数据)内核,对于相同指令可以同时进行。这种设计风格是由于常见的图形算法所决定的,因此,这种设计方式可以让更多的执行单元得到简化。

2008年11月26日 - 夢見島物語 - 君がいる限り

◆CPU和GPU架构之间的差别:

CPU的设计初衷是为了能够以最快的速度按照顺序来执行完一条单一的指令;而GPU的设计则 是为了能够让核心同时执行更多的指令。CPU的工程师们为了尽可能的提高平行处理能力,因此Pentium处理器增加了每周期能够执行两个超标量指 令,Pentium Pro额外增加了顺序执行指令。不过并行处理连续指令还有一些基本限制,那就是增加越来越多的处理能力却不能够获得更好的执行效果。

GPU却从最初的设计就能够执行并行指令,从一个GPU核心收到一组多边形数据,到完成所有 处理并输出图像可以做到完全独立。由于最初GPU就采用了大量的执行单元,这些执行单元可以轻松的加载并行处理,而不像CPU那样的单线程处理。另外,现 代的GPU也可以在每个指令周期执行更多的单一指令。例如,在某些特定环境下,Tesla架构可以同时执行MAD+MUL or MAD+SFU。

其次,GPU还不同于CPU的内存访问原则。例如,如果一个纹理texel在内存中已经就 绪,那么GPU很容易从内存中预读它。同样如果一个像素被写入到帧缓冲区,那么几个周期之后附近的像素也将会被写入。因此,内存部分是不同于CPU的。不 同于通用处理器,GPU不需要交大的缓存,纹理仅需要几个字节(现代GPU高达128-256KB)。同时,内存的运行模式上GPU也与CPU不同。例 如,并非所有的CPU内置内存控制器,而所有GPU产品都会同时拥有多个内存控制器,例如NVIDIA最新的GT200系列拥有多达8个64位通道的内存 控制器。此外,显卡还会采用速度更快的内存设备,所以GPU能够享受到更高的内存带宽,这也是并行计算当中非常重要的一个环节。

通用处理器的晶体管数量大部分都用在了命令缓冲区、硬件分支预测、大量的缓存上,好让CPU 能够在更短的时间内完成单一指令周期。而GPU则不同,GPU将大量的晶体管则用在了阵列执行单位、调度、少量的共享内存、内存控制器等,他们让GPU获 得更高的内存带宽后能够同时处理上千个线程。

◆CPU和GPU缓存之间的差别:

下面再来看看缓存方面的差异,由于CPU内建缓存,因此减少了内存访问的延迟,提高性能;而 GPU则使用缓存或者共享内存来增加内存的带宽。这一点,CPU通过使用大容量缓存和分支预测来实现,这些硬件设施占据了大量的晶体管数量以及功耗。 而GPU则是依靠同时执行数千的线程来解决内存存取延迟,比如,当一个县城正在等待从内存调用数据,而GPU可以同时执行另一个线程而没有延迟。

CPU可以同时执行1~2个线程,而GPU则可以同时执行1024个线程。CPU从一个线程 切换到另一个线程需要几百个周期,而GPU仅需要几个周期就能够完成。此外,处理器使用SIMD (单指令执行多个数据)向量单位而GPU使用SIMT (单指令,多线程)的标线处理。 SIMT并不需要开发数据转换为载体,并允许任意分支线程。

因此,GPU更加适合采用并行计算架构的科学计算或者一些其他的非图形计算。例如大量的分子建模就非常适合使用GPU进行计算,因为他们需要较高的并行计算能力。

综上所述,GPU并行处理的理论性能要远高于CPU。同时,我们也可以通过上面这组NVIDIA统计的近两年来GPU与CPU之间浮点运算能力提升对比表格来看一下。而AMD的RV790 GPU(Radeon HD4950)更是达到了惊人的1.6TFLOPS!

2008年11月26日 - 夢見島物語 - 君がいる限り

 

GPU计算的最先尝试以及其适用的领域

◆GPU并行计算的最先尝试:

实际上,在很久以前就已经有人开始尝试使用GPU进行并行运算了。在起先的尝试当中使用的方 法非常原始,并且不少GPU的硬件功能也被限制,例如rasterizing和Z -缓冲技术。但是出现“Shader”之后,大家开始尝试矩阵计算。早在2003年一个SIGGRAPH当中的部门开辟了GPU运算新篇章—— GPGPU。

这期间,最知名的流处理器编辑器就是Brook,开创了GPU在非图形领域的先河。在此之 前,如果程序员想要调用GPU硬件资源,只能通过OpenGL或者Direct3D两种API接口。OpenGL或Direct3D严重的限制了GPU性 能在3D图形处理意外的应用领域。因为开发人员并不了解如何调用GPU的线程以及内核。是Brook首次让C语言能够实现这一功能,让开发人员无需了解 OpenGL或者Direct3D就能够对GPU资源进行调用。开发人员可以通过一个.br文件进行编码和扩展,产生的代码能够被DirectX、 OpenGL、或x86系统的代码链接库支持。

当然,Brook也同样存在着一些缺点。不过它的这一构想却吸引了NVIDIA以及ATI对于GPU进行并行计算的目光,因为大力发展这一功能将会使得GPU市场打开一个新的篇章。

在这之后,一些开发商开始加入到NVIDIA的市场阵营,并提出一个新的策略,他们可以无需通过现有的API接口就能够完全发挥出GPU的性能。正是他们,为NVIDIA提出了一个全新的概念——CUDA,一种新的专为GPU并行计算而开发的应用程序接口。

◆GPU并行计算的应用领域:

通过一系列的调查,我们可以看到GPU的并行运算能力已经达到了现今主流CPU的5~30倍左右。这个数据并非空穴来风,我们可以从如下一组调查中看到(数字指GPU相对于CPU计算的性能提升倍数):

荧光显微镜:12倍性能提升

分子动力学:8~16倍性能提升

静电学:40~120倍性能提升

2008年11月26日 - 夢見島物語 - 君がいる限り

正如你所看到的,这样的一组数据确实非常具有吸引力,尤其是当你看到性能提升大道100倍以 上时。除此以外,GPU加速还可以利用在:图像和信号分析处理,物理模拟,数学计算,生物学计算,金融计算,数据库,天然气和流体动力学,加密技术,X射 线治疗,天文学,声音处理,生物信息学,生物仿真,计算机视觉,数据挖掘,数字电影和电视,电磁模拟, geoinfo系统,军事应用,山区规划,分子动力学,磁共振成像,神经网络,海洋学研究,粒子物理学,蛋白质凝集模拟,量子化学,射线追踪,可视化,雷 达,油藏模拟,人工智能,卫星数据分析,地震勘探,外科,超声,视频会议等等多方面领域。

并且,我们上面所举的一些例子还仅限于一部分应用领域,而实际上GPU所能够应用到的并行计算领域更加广泛。

什么是CUDA及CUDA对于硬件系统的需求

◆什么是CUDA?

虽然说CUDA被提及的次数越来越多,但是您真的知道什么叫CUDA么?简单来说,所谓 CUDA就是一个能够让程序员通过C语言来实现让NVIDIA的GPU能够对众多并行程序进行统一运算的一种方法。我们前面介绍的GPGPU都是需要通过 图形应用程序接口D3D或者OpenGL来实现,而CUDA则让程序员无需了解D3D或者OpenGL就可以通过简单的C语言环境,通过“线程”来创建应 用程序,这类似于CPU上的多线程程序。不过相比较于仅能有很少线程同时工作的多核CPU的而言,GPU的特性却可以通过CUDA同时执行数千个线程,这 将令我们的应用能处理更多的信息流。

目前能够支持CUDA技术的GPU产品到本文截稿时为止,有NVIDIA的GeForce 8、GeForce 9、GeForce GT200全系列产品以及Quadro和Tesla的系列产品。

2008年11月26日 - 夢見島物語 - 君がいる限り

虽然开发应用在GPU上的CUDA平台比较辛苦,不过相比较早期的GPGPU还是要容易了许多。这些程序必须是一些像MPI多分布式多处理器编程,但是在显存当中的这些数据并没有划分。

CUDA所提供的最重要的创新在于,它使得工作在GPU上的线程可以协作解决问题。在线程间 通讯实现以后,CUDA将允许应用程序更加高效的执行。由NV GPUs的支持,CUDA有一个直接在GPU上的并行计算缓存,它用于保存频繁使用的信息。在GPU上保存信息可以让计算线程即刻得到共享数据而不是去漫 长的等待off-chip的DRAM上的数据。

CUDA的特色如下,引自NVIDIA的官方说明:

1.为并行计算设计的统一硬件软件架构。

2.在GPU内部实现数据缓存和多线程管理。

3.在GPU上可以使用标准C语言进行编写。

4.标准离散FFT库和BLAS基本线性代数计算库。

5.一套CUDA计算驱动。

6.提供从CPU到GPU的加速数据上传性能。

7.CUDA驱动可以和OpenGL DirectX驱动交互操作。

8.与SLI配合实现多硬件核心并行计算。

9.同时支持Linux和Windows。

◆硬件需求:

首先,我们来看看对于CUDA的卡发者和用户群来说,都需要哪些硬件设施。CUDA支持的 GPU (CUDA-enabled GPU)包含GeForce、Quadro和Tesla三个系列:GeForce是NVIDIA公司面向消费市场的GPU产品;Quadro是面向专业图 形市场的GPU产品;而Tesla则是专门面向GPU计算的产品,它不具备图形输出的功能,因此不能作为图形卡来使用。这三个产品面向不同的应用领域,因 此建议在开发和部署CUDA应用的时候需要考虑到产品的应用决定采用不同的GPU。

NVIDIA的CUDA-enabled GPU具有一个完整的产品线,各种用户都可以从中选择到合适自己的产品。对于有高密度计算能力需求的用户来说,Quadro和Tesla则是必须的选择。 诸如Quadro Plex 1000 Model S4和Tesla S870在一个1U高度的标准服务器机架机箱内装备了四个GPU,每个GPU具备128个stream processor以及1.5GB的存储器,每个1U装置总共具备512个stream processor和6GB存储器,非常适合于有高密度、大规模数据计算需求的用户。CUDA-enabled GPU的家族还在不断地扩大之中,随着NVIDIA新一代GPU的发布,更多的产品也将加入到这个行列中来。

另外,CUDA对于GPU产品线还涵盖了从笔记本电脑到高性能多GPU的系统中。也就是说,对于普通用户来讲,我们使用的普通笔记本或者台式电脑,只要拥有一块NVIDIA的GeForce 8以上级别的显卡都能够支持CUDA。

有利又有弊,解析CUDA的优势和局限性

前面我们说过,CPU就好像一个全能型选手,虽然各个领域都能够应对,但是没有一个非常专长 的项目;而GPU则不同,虽然在技术方面不如CPU那样全能,但是在单一领域当中却是技术出众。因此基于GPU并行计算的CUDA这一新领域,在实际的应 用领域当中尤其非常明显的优势,同时也拥有其无法避免的局限性(至少以现在来看还是存在这样的局限性)。如果想要仔细的了解CUDA存在的优势与局限性,

从程序员的角度来看,一个完整的图形处理过程是这样的,几何单元产生三角形,再由光栅单元像素化并输出到您的显示器上。而传统的GPGPU编程设计看起来就像下图这样:

2008年11月26日 - 夢見島物語 - 君がいる限り

根据这个模型,把计算转向GPU的需要一个特殊的处理,甚至追加两个向量需要在屏幕上或者缓 存中画一个符号,这个符号是被光栅化处理的,每一个像素的颜色通过给定的程序进行计算,这个程序为每个像素从纹理中读取输入的数据,并且把它们加进去,同 时在输出缓存中记录下来,这些原本在普通程序语言中能进行的单操作,都能通过多操作计算完成。

所以GPGPU针对通用计算的局限性主要是因为它的专一学习曲线,同时还其它的限制,包括 pixel shader计算只是一个公式,进而依靠协调来描述像素颜色,pixel shader的语言只是通过类似C的句法记录这些公式,早先的GPGPU模型通过巧妙的伎俩使用到GPU的性能,但是非常不方便。数据被图形(纹理)表 示,它的算法是一个光栅,我们需要提到的是它的过程需要一个特殊的执行和存储模型。

NVIDIA目前的GPU计算的架构和前一代的GPGPU模型有不小差别,它允许通过C语言 标准的句法和标记为GPU写程序,并且可以最小化GPU的访问资源,CUDA不需要依靠图形API,并根据通用计算进行特殊的处理。下面我们就来看看 CUDA技术下相比传统GPGPU的优势与限制。

◆采用CUDA技术相比传统的GPGPU计算的优势:

1.CUDA的编程接口采用了标准的C语言程序进行扩展,有利于CUDA的学习

2.每个线程之间CUDA为他们提供了16kb的共享内存,可用于设置缓存,同时还拥有更高的带宽纹理

3.系统内存和显存之间更有效地进行数据传输

4.无需图形API接口进行连接

5.现行内存寻址、聚集和驱散,写入任意地址

6.硬件支持整数和bit操作

◆CUDA技术目前的一些限制:

1.无法循环函数

2.最小Block为32个线程

3.CUDA架构仅限于NVIDIA产品

从1.0到2.0,浅谈CUDA技术的发展历史

   实际上,CUDA是在2006年的11月与G80这款产品一同诞生的,在2007年2月 NVIDIA首次发布了CUDA的公测版,而在2007年6月,CUDA 1.0版与Tesla系列正式登场,到了07年底,CUDA 1.1测试版放出。在CUDA 1.1测试版当中,NVIDIA为其增加了一些新的功能。

在CUDA 1.1版本发布后,NVIDIA也适时的推出了适合CUDA的驱动程序。当时NVIDIA就已经表示,只要GeForce 8系列或更高版本的显卡产品搭载169.XX版本以上的驱动就可以支持CUDA功能了。这是一个非常重要的举措,因为这就意味着,在今后任意一台拥有 GeForce 8以上的显卡都能够支持CUDA了,而无需必须用有一台专业的Tesla产品才能够实现CUDA加速。此外,CUDA 1.1版本还增加了异步执行与数据复制(仅限于G84、G86、G92或更新的产品)、异步数据传输、显存、支持64bit Windows操作系统以及多GPU SLI对CUDA的支持等等功能。

而最新的版本则是在GeForce GTX 200系列产品发布时同步推出的CUDA 2.0版本,而CUDA 2.0测试版则是在今年春天的早些时间推出的。在CUDA 2.0版本当中,增加了如下内容:支持双精度运算(仅支持GT200系列产品)、支持Windows VISTA操作系统(包括32bit和64bit)、支持MacOS X操作系统、分析调试器、3D纹理支持以及优化数据传输等。

让我们来关注一下双精度的问题吧,它的执行效率在新一代的硬件中要比单精度执行效率要慢上数 倍,以GTX280为例,不使用FP32格式下它的最终效率要慢4倍左右,NVIDIA决定通过定义来支持FP64的格式,这是更严酷的考验(一个双精度 单元需要占用多核中的其中一核)。

真实的性能可能会更低,因为在内存与寄存器上都是针对于32bit进行优化的,不过话说回 来,双精度的应用对于图形软件来说并不是特别的重要,GT200支持这一特性也可能只是为了在规格上看起来会更好看一些,而且现在流行的4核处理器执行起 双精度来并不慢。但是大家不用太过于失望就算双精度的执行速度比单精度的要慢10倍甚至更多,支持双精度依然对于混合型的精度处理是很有用的。任何一种对 于精度操作的技术无不是先做好单精度再转攻双精度的,至少现在碰到双精度的时候显卡不需要再把数据传给CPU等待它的处理之后再传递回来,从这一层面来说 支持双精度还是有它的好处的。

还有一点不得不提的是,CUDA 2.0并不是只支持GPU的,它的编译器可以选择它CUDA的代码转成多线程的SSE代码让CPU来执行,这种作法并不只是为了在DEBUG的时候方便, 在实际中也是有用途的,CUDA是NVIDIA公司的产品,但是并不是所有的电脑上装的都是NVIDIA的显卡,编程人员可能有时会为了商业需求需要写两 种不同的代码,但是现在的话CUDA 2.0就可以支持进行转换,虽然在CPU上有些代码会比GPU执行起来慢得多。

只需懂得C语言,CUDA开发的基础介绍

实际上,作为CUDA的核心部分实际上就是一套专门开发的C语言编译器,这套编译器可以将程 序员所写的程序通过编译器实现对GPU功能的调用。而对于C语言来说,目前很多程序员都已经非常熟悉了,即使是不熟悉C语言的程序员也可以轻松上手。这就 使得开发GPU资源的程序员无需经过专门的图形API接口程序培训,轻松的从普通程序开发转移到GPU并行计算的程序开发上。

◆CUDA的计算流程:

为了让大家更加明了CUDA的开发基础,我们首先从NVIDIA的GPU架构上说起。每个 GPU都由一系列的纹理处理集群(Texture Processing Clusters)来组成,每一组纹理处理集群则是由一大块纹理撷取单位和和2~3组流处理器组成,而它们则是由8个处理单元(Core)以及两组超级函 数单元组成。所有指令均按照SIMD(单指令多线程)原则执行,当一个指令调用后,所有线程同步运算。

2008年11月26日 - 夢見島物語 - 君がいる限り

从上图可以看到,每组处理器都拥有16kb的共享内存,不过这16kb并非高速缓存。但是程 序员确可以通过程序对其任意调用,这样这些共享的内存就可以允许每一个Block内的线程进行数据交换。而每个Block当中的线程只能够访问到本 Block当中的数据或者是外层的共享数据,但是每个Block与Block之间的数据是无法进行通讯的。处理器也可以调用显存,不过显存则存在着较高的 潜伏期以及较低的吞吐量的问题。为了加快显存调用的访问速度和降低频率,每个多处理器拥有8k的常量和纹理缓存。

通过驱动程序吧所有数据和指令拷贝到每个Block当中,然后再让所有的线程同时开始运行, 直到最后一个线程结束后,整个运行结束。对于这样相同指令、相同数据的运算不会出现换页的现象,同时也不会出现缓存需要刷新的现象,因此我们可以通过超大 的线程数得到性能方面的飞跃提升。

编程时,如果想为一个Block写入指令,那么只需要像C寓言那样编写一个函数,通过 CUDA的方法进行调用。而后面的事情,就可以交给CUDA的编译器nvcc来执行,它将会自动将代码编译成CPU代码或者GPU代码,并且GPU代码将 会自动发送到你所指定的那个Block当中。而CPU处理的代码则由开发者的标准C编译器编。这期间,一系列的动作完全无需程序员的干涉。这也是为何 NVIDIA一直都在宣传CUDA的便携性优势所在。

例如,一个14个多核处理器的显卡产品,如果每个多核处理器拥有112个核心,每个核心拥有 65536*65536*1个Grid,每个Grid拥有512*512*64个Block,每个Block又可以同时最多运行512个线程(每个 Block拥有8个寄存器)。我们可以粗略的算出这块显卡可以同时进行越85亿个线程,而仅需要十亿字节的存储器就够用了,也就是说我们的显存一般情况下 是足够用的。

深入解析CUDA的编程模型以及存储模型

◆CUDA的编程模型:

2008年11月26日 - 夢見島物語 - 君がいる限り

通过CUDA让GPU进行并行计算时,能够让每个处理器同时进行不同数据元素的SIMD相同 指令运算,这是可以将GPU看做可以并行执行非常多个线程的计算设备。此时我们可以将GPU看做是一个CPU的协处理器,并且它还拥有自己的内存。也就是 说,主机在接到大量并行、计算密集的部分时,将这一任务加载到GPU上来运行。

采用CUDA编程这就意味着要分组线程,线程分批应用程序的数据不相关一个核心 (kernel)被组织在一个由线程块(thread block)组成的线程格(grid)内。划分应用程序为不相关的核心由用户程序员完成。更准确地说,多次但在不同数据上独立执行的应用程序部分可以独立 放到在此设备上作为许多不同线程执行的函数中。要达到这种效果,可以将这样一个函数编译到设备的指令集合中,并将得到的程序(叫做内核, kernel)下载到设备上。

◆CUDA的存储模型:

2008年11月26日 - 夢見島物語 - 君がいる限り

每个设备都可以看做是一个Multiprocessors(多处理器),在每个 Multiprocessors当中都具有SIMD(单指令多数据)架构,在任意一个指定的时钟周期内,Multiprocessors当中的每个 Porcessor(处理器)都可以执行不同数据上的相同指令。并且每个Multiprocessors当中都有如下四种类型的内存储器:

1.每个Porcessor有一组本地32bit寄存器

2.并行数据高速缓存或称为共享内存(上图中的Device Memory部分),由所有Porcessor共享并实现共享内存空间

3.只读常量高速缓存(上图中的constant cache部分),由所有Porcessor共享并加速从常量内存空间的读取,实现为设备内存的只读区域

4.只读纹理高速缓存(上图中的texture cache部分),由所有Porcessor共享并加速从纹理内存空间的读取,实现为设备内存的只读区域

本地内存和全局内存是设备内存的读写区域,并且没有高速缓存设计。每个 Multiprocessors通过纹理单位(texture unit)访问纹理高速缓存,其中纹理单位实现各种寻址模式和数据筛选。在设备上执行的线程只能通过下列内存空间访问设备的DRAM和芯片内存储单元,如 图所示:

2008年11月26日 - 夢見島物語 - 君がいる限り

1.读写每线程寄存器

2.读写每线程本地内存

3.读写每块共享内存

4.读写每网格全局内存

5.只读每网格常量内存

6.只读每网格纹理内存

Global Memory(全局)、Global Memory(常量)和Global Memory(纹理)内存空间可以通过主机读或写,并永久存在于相同应用程序的内核启动中。Global Memory(全局)、Global Memory(常量)和Global Memory(纹理)内存还为不同的内存使用进行了优化。Global Memory(纹理内存)还为一些特定的数据格式提供不同的寻址模式以及数据筛选。

编程环境和优化,CUDA未来之路还很长

◆CUDA编程环境:

CUDA包括的运行库:

CPU与GPU共享内置向量类型和RTL子集

CPU组件——控制一个或一组GPU

GPU组件——特殊GPU功能

多用途处理器采用CUDA接口的的工作方法,在一个显卡当中为核心处理复制若干副本。CPU 的代码执行如下操作:初始化GPU、分配系统和显卡内存、复制常量到显存当中、在显卡中启动若干副本内核程序、从显存中复制结果、释放内存、结束进程。以 下是一段在CPU上运行的CUDA代码举例:

2008年11月26日 - 夢見島物語 - 君がいる限り

GPU执行当中会出现如下的限制:无法递归、无静态变量函数或者此函数无赋值。支持两种内存 管理模式:32bit线性内存访问指针和只通过纹理拾取功能实现CUDA存取阵列。图形API资料可以调用CUDA全局定义,包含这一资料的地址指向。原 始API可以支持OpenGL下的PBO / VBO和Direct3D9下的顶点缓存和纹理(包括2D、3D和立体)。

CUDA应用的编译流程如下:

2008年11月26日 - 夢見島物語 - 君がいる限り

原始的CUDA C源代码使用NVCC进行编译工作,NVCC只是作为大量开发工具的一个外壳在使用,这些开发的工具还包括CUDA CC,g++,cl等等,NVCC生成了包括其它应用部分所需要的CPU代码,简单的利用标准的C代码与PTX主体代码就可以为GPU使用,但是需要提醒 一下的是最终的CUDA代码执行文件需要CUDA的RUNTIME库(cudart)与CUDE core库,这一点上是跟很多流行的编程语言是一样的,例如JAVA或者微软的.net等等。

◆CUDA应用优化:

一个简单的举例并不能一下说完CUDA编程优化的全部内涵,为了能够最大限度的发挥CUDA 的效果,我们必须暂时的忘记那些为CPU作优化的常用编辑方法,与CPU执行线程量少暂少相比较,CUDA的算法可以同时执行成千上万的线程。这一点对于 最大优化的选择临时寄存器以及共享内存等是非常重要的,最简单的说可以最大限度的减小CPU与GPU之间互换的数据流。当你进行CUDA的应用优化时,与 之前最大的不同是你应该尽可能的要去平衡一下每一个代码模块之间的执行数量,照我们的理解在一段的代码模块里插入越多的执行线程,是可以降低存储器延迟所 带来的影响的,但是另一方面它也会大量的占用临时寄存器。所以NVIDIA建议在一个代码模块里使用128至256个线程,这样可以达到平衡存储器延迟与 寄存器数量的效果,如果你的代码模块里超过512个线程的话,它将对于执行起来的效率起到负作用。另外CUDA优化的另一个关键点在于尽可能的使用共享的 内存,因为它的执行效率要比显存上来得高(考起到显存是需要通过南北桥之间互动,再进行读取的这一种固定模式),如果可能的话在通用内存上的读取与写入的 操作建议进行合并,当然为了达到这个合并的目的,你可能需要使用到一些特别的数据类型在一个操作周期内去读写32/64/128bits,如果合并读取操 作比较困难的话,当然你还可以尝试使用纹理查找的模式。

◆开放性标准,更加值得推广:

NVIDIA的CUDA架构是为GPU进行并行运算的一个良好解决方案,CUDA可以运行在 很多的NVIDIA显卡产品上。它从根本上改变了GPU的设计模式,让并行运算的编程更加简便,并且增加了不少新的功能,例如共享内存、线程同步、双精度 和整数运算等等。CUDA可以让每一个软件开发者使用标准C语言开发。发展GPU的并行计算处理或许会对高性能计算产业产生巨大的影响,因为全球任意一台 PC上都拥有一个并行计算能力无比强大的显卡。而CUDA想要走向成功,还需要最重要的一步——推广。

实际上对于NVIDIA来说,CUDA的推出并非一个简单的事情。CUDA的推出预示着NVIDIA正在朝向一个崭新的领域进军,究竟用户群能否接受NVIDIA所提供的这个新领域,NVIDIA所要做的至少要满足如下三方面的要求:

1.CUDA的软件卡发环境尽可能简单,或者说尽可能贴近现有的程序开发环境,能够让软件开发人员轻松上手,而无需过多的学习。

2.有更多的软件产品出现,能够让大多数用户看到CUDA的优势,并且要让用户感到能够使用到基于CUDA的软件。

3.足够多的行业用户加入成为CUDA一员,每个行业中有足够多的成功案例和开放资源。

目前看来,NVIDIA为CUDA已经做出了最大的努力,目前他们也已经尽量将前两个条件做 到了最好。而将来,NVIDIA还要为第三个方面的要求进行推广,市场推广策略、技术支持方式与渠道、第三方合作的广度和深度都息息相关。不过,CUDA 本身是完全免费的一个开发工具,任何开发者都可以从NVIDIA网站上下载相应的开发工具和使用手册。这对于技术爱好者来说是个福音!

2008年11月26日 - 夢見島物語 - 君がいる限り

斯坦福大学的分布式计算系统非常有名,其开发了一套名为Folding@home的 客户端软件,所有互联网电脑都可以通过这套软件模拟复杂的蛋白质折叠效应科学计算。目前Folding@home推出了支持CUDA的版本,我们可以利用 GeForce GTX200系列的GPU科学计算能力进行运算。安装上CUDA版本的Folding@home后,我们现在开启显示窗口,可以看到当前计算的即时速度。 使用GeForce GTX280时,大约显示的速度为500多ns/day。而如果使用CPU,速度大概只有4ns/day左右,可以看到GTX280的科学运算能力非常 强。

2008年11月26日 - 夢見島物語 - 君がいる限り

Badaboom这款软件的全称为BadaBOOM Media Convertor,是一款面向消费级的产品,这款软件在不久前已经推出了正式版1.0版。Badaboom的价格为29.99美元,它的推出开启了利用 高性能GPU(图形处理器)进行游戏以外应用的先河。Badaboom的界面简单直观,初学者也能很快上手。另外,转码所需要的时间也大为缩短(因此耗电 量大幅度降低),而且CPU也得到了释放,来处理其它计算任务。

◆ Google earth需要3D加速

Google earth是一款3D地图显示软件,它能够将地球上某一区域的地貌,以3D图像的形式展现出来。这款软件读者都很熟悉,早期的Google earth从2D起步,但是随着深入发展和商业应用,这款软件也进入了3D化,很显然,这类软件将会逐渐成为我们今后生活的必备软件。在Google earth的设置界面,如果你拥有一个性能强劲的显卡,那么可以将画质设置为最高,这是在没有GPU加速功能的PC上无法体验的速度感。

当我们以最高画质量为限查找地图街景时,带有GPU的PC系统可以流畅地进行地图缩放。而同 样的场景、同样的搜索速度、同样的处理器,在没有GPU加速时,运转速度简直无法忍受,在Fraps显示的速率上,使用GPU加速和不使用GPU加速情况 下,速度落差达到了几十倍之巨,由此可见,GPU的作用和意义绝不仅限于游戏。

◆ 图片、视频都是3D的

2008年11月26日 - 夢見島物語 - 君がいる限り

Cooliris推出的Piclens插件可以让图片搜索变为3D模式,通过用GPU硬件加速来实现图片浏览。但就是这么一个实用的小插件,没有GPU也是不行的。鼠标滚轮就能让所有图片成为一面幕墙,这么有趣的功能没有GPU加速可是不行的哦。

浏览图片时GPU加速非常有意义,在使用普通集成显卡时,这个数值还不到24fp。当我们使用一块GeForce 9600GT进行GPU加速时,cooliris满速率运行可达60fps,但换用集成显卡时,这个数值还不到24fps,前后的差距至少达到了2.5倍。

◆ 连PDF都需要GPU加速

2008年11月26日 - 夢見島物語 - 君がいる限り

随着计算机的发展,图形、图像的显示成为越来越重要的工作。现在连阅读传统的PDF文件,都离不开GPU的加速了。早在2007年,Adobe就与NVIDIA展开合作,推出了支持GPU加速的PDF版本。

同样一个容量达到50MB的期刊读物电子版PDF文件,在使用传统方式打开时,读取时间为8秒。而使用GPU硬件加速功能时,打开时间不超过3秒,且在浏览时不会有拖沓感,PDF文件也变得流畅异常了。

◆ 图片浏览也向3D迈进—Google Picasa2

2008年11月26日 - 夢見島物語 - 君がいる限り

Google Picasa2是一款可帮助您在计算机上立即找到、修改和共享所有图片的软件。在使用NVIDIA显卡的电脑上使用Picasa软件,通过GPU加速,图 片的拖放或文件夹切换,图片生成的速度都非常快。如果换用没有GPU加速的平台,搜索图片时生成速度可绝非一时一刻,前后对比,数倍的差异十分明显。

◆ PICTOMIO,华丽的3D图片浏览

Pictomio是一个类似于Picasa的图片浏览和管理软件,它提供了极其华丽3D图片 浏览效果。如果PC中具备GPU,那么完全可以利用强大的GPU将浏览方式变更为3D模式,无缝缩放、渐变式切换,效果十分惊叹。但如果没有GPU,平面 的交互效果实在是太过让人失望了

◆CUDA的未来更美好:

除了上述这些我们提到的已发布软件外,实际上目前基于NVIDIA CUDA技术开发的软件还有不少,例如鼎鼎大名的PhotoShop CS4当中也将会出现以CUDA为基础的插件,届时将会实现GPU加速滤镜处理等等众多的功能。除此以外,根据NVIDIA表示在未来一段时间里也将会有 不少其他方面的CUDA软件将出现。

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值