CUDA为GPU赋予了新的使命,推进计算行业快速发展,让计算从“CPU处理”时代向CPU与GPU“协同处理”时代迈进。今天让我一起来聊一聊加速计算行业发展的时代引擎--CUDA!
一、CUDA提出背景:发挥GPU强大的并行计算能力,拓展GPU应用场景
2006年,英伟达推出杀手级产品-GeForce 7300GT,精准定位中低端GPU市场,其凭借超高性价比成功击败老对手的ATi Radeon X1600。
凭借GeForce 7300GT的成功,英伟达在图形处理市场份额持续攀升,截至2006年底,其市场份额超过70%,占据绝对领先地位。
但英伟达并不满足于图形处理市场的成功,想为GPU开拓更多的应用场景,让其充分发挥并行计算能力强大的优势,使其不再局限于“图形处理”领域。
想要实现这个想法并不容易,因为当时的GPU和CPU之间存在着很大的差异:首先,GPU和CPU之间使用PCIe接口来通信,这个接口的带宽低和延迟高,导致数据传输效率很差。其次,GPU和CPU之间使用不同的内存空间和管理方式,导致内存访问和同步复杂。最重要的是,GPU和CPU之间使用不同的指令集和编程模型,导致程序开发和移植困难。同时,由于GPU和CPU之间使用不同的调度和执行机制,导致任务分配和协调困难。
为了解决这些问题,NVIDIA需要找到一个合作伙伴,一个能够提供强大的CPU,并且愿意支持NVIDIA的想法的合作伙伴。当时的英特尔已经是CPU市场的霸主,它拥有强大的技术实力和市场影响力。但同时也面临着诸多挑战,例如:摩尔定律的瓶颈,功耗墙的限制,多核心扩展的困难,新兴领域的竞争,即科学计算、机器学习、密码学等领域对CPU提出了更高的要求。英特尔也在寻找一种新的技术方案,一种可以提高CPU性能、降低CPU功耗、增强CPU并行性、拓展CPU应用领域的技术方案。2006年,由英伟达首席科学家David Kirk亲自带队,开发了一个基于英伟达 GPU 平台上面定制的特殊计算体系/算法 - CUDA(Compute Unified Device Architecture,统一计算架构)!它让GPU和CPU通过一种全新的方式实现高效地交换数据,它使GPU不仅能处理图形任务,还能处理通用计算任务,扩展GPU在科学计算、机器学习、密码学等领域应用。2006年,英伟达和英特尔达成了一项历史性的合作协议,他们共同开发了一种基于CUDA的新型GPU,即G80 GPU(GeForce 8800 GTX)。
二、CUDA魔法加持:GPU计算效率实现最大化
CUDA本身是一种并行计算平台和编程模型,其编程语言是一种“类C语言”,兼容C语言,CUDA编程语言和C语言差异并不大,非常适合普通开发者使用。CUDA改进了DRAM的读写灵活性,使得GPU与CPU的机制相吻合,同时,CUDA也提供了片上(on-chip)共享内存,使得线程之间可以共享数据。应用程序可以利用共享内存来减少DRAM的数据传送,减少对DRAM内存带宽的依赖。在CUDA的加持下GPU计算效率实现最大化,从而帮助GPU扩展到所有适合并行计算的领域,GPU也逐渐成为了GPGPU。下面我们通过一个具体例子来说明CPU、GPU 与CUDA优化的GPU运算能力的差异。
当我们要算100次从1到100的加法:如果使用一个4线程的CPU,CPU需要进行100/4*100=2500次计算。如果使用一个1000线程的GPU,GPU需要进行100/1000*100=10次计算。如果使用CUDA优化的英伟达的GPU,它能提供优化算法的“1+100,2+99的这种利用首尾相加再除以2”的方法来简化计算,那么使用CUDA优化的GPU只需要100/1000*100/5=2 次计算。相比CPU,采用CUDA优化的GPU计算效率提升了近百倍。相比普通GPU,CUDA优化的GPU计算效率也提升了5倍,所以,即便竞争对手的GPU在硬件参数上比肩英伟达GPU,但缺少CUDA的优化,其计算效率还是无法比肩英伟达GPU。
三、CUDA架构组成:开发库、运行期环境和驱动
从体系结构的组成来说,CUDA包含了三个部分:开发库、运行期环境和驱动。
1.开发库
它是基于CUDA所提供的应用开发库。以CUDA 1.1为例,它提供了两个标准数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员可以在开发库基础上快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。
2.运行期环境
它提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(Host Code),一种是运行在GPU上的设备代码(Device Code)。由于不同类型的代码运行的物理位置不同,以及访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。
3.驱动
基于CUDA开发的应用必须有NVIDIA CUDA-enable的硬件支持,而不同版本GPU之间存在差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能。
四、CUDA推广策略:完全免费使用,不求短期回报,快速占领市场
英伟达CEO黄仁极具远见,将拓展GPU应用领域作为公司首要任务。因此,CUDA推出后完全免费,不求短期回报,完全推广的策略,使CUDA平台开发者快速增长,同时也帮助英伟达在AI市场抢占先机。英伟达大力支持CUDA系统在AI及相关领域的开发与推广,早在2006年,英伟达每年投入高达5亿美元的研发经费(全年营收 30 亿美元),对CUDA进行持续更新与优化 ,并让当时美国大学与科研机构免费使用,这让CUDA迅速在AI以及通用计算领域开花结果。
五、CUDA发展历程:持续演进与优化,革命从未停止
为了让广大开发者更方便的使用GPU的计算能力,英伟达不断优化CUDA开发库与驱动系统。从2006年发布至今,共发布了12个大版本,52个小版本,经过英伟达持续地更与新迭代,CUDA功能与性能进一步优化、兼容性不断调整、支持更多计算架构、错误得到修复、稳定性逐步改善。
1.功能增强
CUDA的每个新版本都会带来一些新功能或API。例如,CUDA 10引入了一个全新的任务图功能,它允许用户将一系列的任务(例如内核、数据传输等)组织成一个图形,从而提高执行效率。而CUDA 11则引入了新的编程模型和库功能。
2.性能提升
随着版本升级,CUDA性能持续不断地优化,以提高运行速度和效率。例如,CUDA 9引入了Cooperative Groups(一个新的编程模型),可以帮助开发者更容易地编写并行和并发代码。
3.兼容性调整
每个新版本对旧版编译的代码的兼容性有所不同。有些新版本可能不再支持一些旧版本的特性,或者对某些API的行为进行了修改。
4.错误修复和稳定性改进
每一个新版本的CUDA都会修复一些已知的错误,并且提高CUDA的稳定性和可靠性。这些改进使得新版本的CUDA在实际使用中更加稳定,可以处理更多的任务。
5.支持更多计算架构
每个CUDA版本都支持一系列的计算架构,随着版本的升级,支持的计算架构列表也会更新。有些新的计算价格可能只在新版本的CUDA中得到支持。例如:CUDA8.0,9.x,10.x。
CUDA8.0:● 费米 (Fermi,GTX580)● 开普勒(Kepler,GTX680,GTX780Ti,GTX Titan,Titan Z,Tesla K80)● 麦克斯韦(Maxwell,GTX980Ti,Titan X,Tesla M40)● 帕斯卡(Pascal,GTX1080Ti,Titan Xp,Tesla P100)
CUDA9.x:● 开普勒(Kepler,GTX680,GTX780Ti,GTX Titan,Titan Z,Tesla K80)● 麦克斯韦(Maxwell,GTX980Ti,Titan X,Tesla M40)● 帕斯卡(Pascal,GTX1080Ti,Titan Xp,Tesla P100)● 伏特(Volta,Titan V,Tesla V100)
CUDA10.x:● 开普勒(Kepler,GTX680,GTX780Ti,GTX Titan,Titan Z,Tesla K80)● 麦克斯韦(Maxwell,GTX980Ti,Titan X,Tesla M40)● 帕斯卡(Pascal,GTX1080Ti,Titan Xp,Tesla P100)● 伏特(Volta,Titan V,Tesla V100)● 图灵(Turing,RTX2080Ti,Titan RTX,Tesla T4)经过多年优化与迭代,CUDA已经形成独特软硬件配合的生态系统,为英伟达GPU产品构建了极深的护城河。
六、CUDA应用场景:从图形处理到科学计算,持续探索创新应用领域
时至今日,支持CUDA的GPU销量已经超过1亿,成千上万的软件开发人员使用免费的CUDA软件开发工具来解决各种应用程序中的问题,而这些应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域。
1.图形渲染与视觉效果作为GPU技术的基石,CUDA不仅加速了3D图形渲染,还促进了电影特效、建筑设计可视化、游戏开发等领域的实时渲染和物理模拟。
2.深度学习与人工智能CUDA是推动深度学习革命的关键技术之一。它支持诸如TensorFlow、PyTouch等主流深度学习框架,加速神经网络的训练和推理过程,广泛应用于图像识别、自然语言处理等AI应用。
3.科学计算与工程模拟在物理与化学模拟、气候研究、天文学、生物信息学等领域,CUDA被用来加速复杂的数值计算和模拟过程,例如分子动力学模拟软件AMBER就利用CUDA来加速新药的研发(AMBER 是一款分子动力学模拟程序,全世界在学术界与制药企业中有超过60,000名研究人员使用该程序来加速新药的探索工作)。
4.高性能计算与大数据处理在超级计算中心,CUDA被用于构建高性能计算集群,例如德国、波兰、日本的量子计算中心采用CUDA-Q平台推进量子计算研究。另一方面,CUDA加速了大数据的清洗、转换、分析流程,极大地提升了数据科学家和分析师的工作效率。CUDA赋予GPU新的生命!它让GPU不再只是一个图像加速处理器,而是成为一个通用计算器。它让开发者不再只是一个游戏开发者,而是一个工程师、科学家、艺术家。