GPU通用计算与CUDA

目前,主流计算机中的处理器主要是中央处理器CPU和图形处理器GPU。传统上,GPU只负责图形渲染,而大部分的处理都交给了CPU。

21世纪人类所面临的重要科技问题,如卫星成像数据的处理、基因工程、全球气候准确预报、核爆炸模拟等,数据规模已经达到TB 甚至PB量级,没有万亿次以上的计算能力是无法解决的。与此同时,我们在日常应用中(如游戏、高清视频播放)面临的图形和数据计算也越来越复杂,对计算速度提出了严峻挑战。

GPU在处理能力和存储器带宽上相对CPU有明显优势,在成本和功耗上也不需要付出太大代价,从而为这些问题提供了新的解决方案。由于图形渲染的高度并行性,使得GPU可以通过增加并行处理单元和存储器控制单元的方式提高处理能力和存储器带宽。GPU设计者将更多的晶体管用作执行单元,而不是像 CPU那样用作复杂的控制单元和缓存并以此来提高少量执行单元的执行效率。图1-1对CPU与GPU中晶体管的数量以及用途进行了比较。



受游戏市场和军事视景仿真需求的牵引,GPU性能提高速度很快。最近几年中,GPU的性能每一年就可以翻倍,大大超过了CPU遵照摩尔定律(每 18~24月性能翻倍)的发展速度。为了实现更逼真的图形效果,GPU支持越来越复杂的运算,其可编程性和功能都大大扩展了。

目前,主流GPU的单精度浮点处理能力已经达到了同时期CPU的10倍左右,而其外部存储器带宽则是CPU的5倍左右;在架构上,目前的主流GPU 采用了统一架构单元,并且实现了细粒度的线程间通信,大大扩展了应用范围。2006年,随着支持DirectX 10的GPU的发布,基于GPU的通用计算(General Purpose GPU,GPGPU)的普及条件成熟了。

NVIDIA公司于2007年正式发布的CUDA(Compute Unified Device Architecture,计算统一设备架构)是第一种不需借助图形学API就可以使用类C语言进行通用计算的开发环境和软件体系。与以往的传统 GPGPU开发方式相比,CUDA有十分显著的改进。经过两年多的发展,CUDA与支持CUDA的GPU在性能上有显著提高,功能上也在不断完善。

由于在性能、成本和开发时间上较传统的CPU解决方案有显著优势,CUDA的推出在学术界和产业界引起了热烈反响。现在,CUDA已经在金融、石油、天文学、流体力学、信号处理、电磁仿真、模式识别、图像处理、视频压缩等领域获得广泛应用,并取得了丰硕的成果。随着GPU的进一步发展和更多的开发人员参与到GPU通用计算的开发中来,可以预见,GPU将在未来的计算机架构中扮演更加重要的角色,甚至许多以往被认为不可能的应用也会因为GPU的强大处理能力而成为现实。


1.1  多核计算的发展

并行是一个广义的概念,根据实现层次的不同,可以分为几种方式。如图1-2所示,最微观的是单核指令级并行(ILP),让单个处理器的执行单元可以同时执行多条指令;向上一层是多核(multi-core)并行,即在一个芯片上集成多个处理器核心,实现线程级并行(TLP);再往上是多处理器(multi-processor)并行,在一块电路板上安装多个处理器,实现线程和进程级并行;最后,可以借助网络实现大规模的集群或者分布式并行,每个节点(node)就是一台独立的计算机,实现更大规模的并行计算。




伴随着并行架构的发展,并行算法也在不断成熟与完善。从历史上看,并行算法研究的高峰是在20世纪七八十年代。这一阶段,出现了很多采用不同互连架构和存储器模型的SIMD机,以及许多优秀的并行算法,在整个并行算法研究历史上谱写了辉煌的一页。20世纪90年代中期以后,并行算法的研究更加注重面向应用,不但研究并行算法的设计与分析,也兼顾并行机体系结构与并行应用程序的设计。

工艺、材料和功耗的物理限制,处理器的频率不会在短时间内有飞跃式的提高,因此采用各种并行方式提高计算能力势在必行。现代CPU的每个核心中都采用了超标量 、超级流水线 、超长指令字 、SIMD 、超线程、分支预测等手段发掘程序内的指令级并行,并且主流的CPU中也有多个处理器核心。而GPU与生俱来就是一种众核并行处理器,在处理单元的数量上还要远远超过CPU。

目前计算机中的处理器主流是拥有2~8个核心的多核CPU,及拥有数十乃至上百个核心的众核GPU,并且两者的核心数量仍会继续增加。多核和众核处理器的普及使得并行处理走入了寻常百姓家,不再是大型机和集群的专利。这也使得并行算法和并行编程成为程序员必须了解和掌握的内容。


1.1.1  CPU多核并行

过去20年间,Intel、AMD等厂家推出的CPU性能在不断提高,但发展速度与20世纪80年代末90年代初的飞跃相比,已经不能相提并论。按照摩尔定律,每18~24个月芯片上可集成的晶体管数量就会翻倍,这一速度带来了处理能力和速度的飞速增长。

CPU提高单个核心性能的主要手段是提高处理器的工作频率,以及增加指令级并行。这两种传统的手段都遇到了问题:随着制造工艺的不断提高,晶体管的尺寸越来越接近原子的数量级,漏电流问题愈加显著,单位尺寸上的能耗和发热也越来越大,使得处理器的频率提高速度越来越慢。另一方面,通用计算中的指令级并行并不多,因此费尽苦心设计获得的性能提高与投入的大量晶体管相比,显得很不划算。使用流水线可以提高指令级并行,但更多更深的流水线可能会导致效率问题,例如,Intel的Pentium 4架构中有更长的流水线,但运算性能还不及同频的Pentium Ⅲ。为了实现更高的指令级并行,就必须用复杂的猜测执行机制和大块的缓存保证指令和数据的命中率。现代CPU的分支预测正确率已经达到了99%以上,没有什么提高余地。缓存的大小对CPU的性能有很大影响,过去低端的赛扬和主流的奔腾处理器用于计算的单元基本一样,主要区别就在于缓存的大小。但是继续增加缓存大小,最多也就是让真正用于计算的少量执行单元满负荷运行,这显然无助于CPU性能的进一步提高。

由于上述原因限制了单核CPU性能的进一步提高,CPU厂商开始在单块芯片内集成更多的处理器核心,使CPU向多核方向发展。2005 年,Intel和AMD正式向主流消费市场推出了双核CPU产品,2007年推出4核CPU,2009年Intel CPU进入8核时代,Intel CPU核心数量及制程的变化如图1-3所示。随着多核CPU的普及,现代的普通PC都拥有数个CPU核心,实际上已经相当于一个小型集群。可以预见,未来 CPU中的核心数量还将进一步增长。与此同时,多核架构对传统的系统结构也提出了新的挑战,如存储器壁垒、芯片、板极、系统级均衡设计以及可移植性等方面的问题。

随着CPU从单核发展为多核,越来越多的程序员也意识到了多线程编程的重要性。多线程编程既可以在多个CPU核心间实现线程级并行,也可以通过超线程等技术更好地利用每一个核心内的资源,充分利用CPU的计算能力。除了直接使用操作系统提供的线程管理API实现多线程外,还可以通过一些库或者语言扩展等方法实现多线程并行计算。目前常见的多线程编程语言扩展有OpenMP和Intel的TBB(Thread Building Block)等。


表1-1  计算机的Flynn分类

分类 说明
SISDSingle Instruction Single Data)系统 传统的计算机是单CPU,同一时刻只能执行一条指令,处理一个数据,即一个控制流和一个数据流的顺序执行。SISD也可以并行,只要各CPU执行不同的指令流,处理不同数据空间的数据流,就仍是SISD模式
SIMD
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CUDA编程是一种用于GPU并行计算的编程模型,它由NVIDIA推出并应用于其显卡产品系列。通过CUDA编程,开发者可以利用GPU的并行计算能力来加速各种计算任务。下面是一些关于CUDA编程和GPU并行计算的重要概念: 1. GPU:图形处理器(Graphics Processing Unit)是一种专门用于处理图形和并行计算的硬件设备。与传统的中央处理器(CPU)相比,GPU具有更多的核心和更高的内存带宽,适合并行计算任务。 2. CUDA:Compute Unified Device Architecture(CUDA)是一种并行计算平台和编程模型,用于利用GPU进行通用目的的并行计算CUDA提供了一套API和工具,使开发者能够直接在GPU上编写并运行并行计算代码。 3. 核函数(Kernel Function):在CUDA编程中,开发者可以定义一个称为核函数的特殊函数。核函数在GPU上并行执行,并且每个线程都会独立地执行该函数。通过合理设计核函数,开发者可以利用GPU的并行计算能力来加速各种计算任务。 4. 线程、块和网格:在CUDA编程中,GPU上的并行计算是以线程为基本单位进行的。线程被组织成块(block),而块又可以组织成网格(grid)。开发者可以通过调整块和网格的大小来优化并行计算的性能。 5. 内存管理:CUDA提供了多种类型的内存,开发者可以根据需要选择合适的内存类型。其中,全局内存(Global Memory)是GPU上所有线程都可以访问的共享内存,而共享内存(Shared Memory)是块内线程共享的高速缓存。合理地使用不同类型的内存可以提高并行计算的效率。 通过CUDA编程,开发者可以将适合并行计算的任务分配给GPU来加速处理。这种方式在科学计算、深度学习、图像处理等领域得到广泛应用,能够显著提高计算性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值