并行编程实战——CUDA编程介绍
一、CUDA为什么会出现
大家都知道,计算机最初的任务处理,基本是CPU来完成,所以CPU承受了各种任务调度和IO管理等复杂的场景管理。但随着计算机技术的发展,特别是游戏、视频等对图像和视频处理的需求越来越高,就出现了专门处理这类任务的计算机模块——显卡,而显卡的核心就是GPU模块。如果说CPU是一个多面手,那么相对来说GPU就是一个屠龙刀,专门用来处理图像和视频。而稍微有一点这方面知识的都知道,图像和视频底层其实就是大量数据的处理,由于它们有很类似的处理结构,所以在GPU中可以有大量的相同的处理核心。一般来说,单颗CPU的核心最多也就是在百量级上(通常就是几十颗),而单个显卡核心的量级最少也会在千量级以上(三五千颗很正常)。
看到这个,大家是不是想到了一个重要的编程范式,也就是并行编程!CPU胜任于复杂场景下的任务和数据处理,而GPU更适合于单纯数据计算和数据处理的任务。理论上讲,核心数量越多,并行编程的并行量可能越高,那么并行的效率也就可能越高。而随着近年来,大数据的兴起,特别是AI编程的兴起,对数据处理无论是量上还是速度上都提出了更高的要求,而以CPU为代表的并行编程,已经出现了严重瓶颈,但对GPU来说,处理这种大数据反而更具有天然的优势。
于是GPU编程便当仁不让的充当了AI时代的编程先锋。而GPU编程离不开显卡厂商的支持,而现在的GPU的核心技术厂商只有两家,一个是NVIDIA,俗称N卡;一个是AMD(即以前的ATI),俗称A卡。
而CUDA就是NVIDIA开发一种统一计算平台用来支持并行计算的编程模型。
二、GPU编程和CUDA
GPU的核心数量众多,更适合于大规模的并行处理大数据,特别是适合计算密集型及高并行任务的设计,最典型的如区块链中的最小哈希寻找。GPU编程被广泛应用于机器学习、深度学习、医学、仿真技术、超算以及科学建模等领域。
而为了更好的复用显卡中的核心并压榨出其最大的并行效率,NVIDIA开发出了CUDA框架,CUDA,Compute Unified Device Architecture。它是NVIDIA用来处理并行计算的平台和编程模型,可以理解为为方便在其显卡上进行二次开发的底层库。CUDA支持直接在NVIDIA GPU充分利用GPU算力进行通用计算。
CUDA本身有一套扩展的C/C++语言(如__global__等一系列关键字)和相应的开发工具链(如nvcc编译器等),方便开发者在GPU上编写和运行、测试相关的代码。
三、CUDA的特点
CUDA框架的特点非常鲜明:
1、支持高并行架构设计
前面提到过GPU中有成千上万个处理核心单元,对并行的大规模数据处理有着天然的优势
2、高性能计算
由于并行计算和大数据的吞吐,使得单张显卡的数据处理量相对于CPU来说是一个无法比拟的存在,所以其性能和效率是非常高的
3、平台的专用性
由于某些大家熟悉的原因,CUDA的计算是依赖于其特定的硬件平台的,而这种情况既是优势也是劣势。在NVIDIA显卡上,CUDA框架可以尽可能的提供更强大的算力,而在非此平台的显卡上,就力有所不歹了。
四、CUDA与OPENCL
其实其它一些公司也有自己的此类开发框架,如AMD的ROCm,苹果的Metal。但实际的应用中CUDA占有非常重要的地位。同样,有专业的平台框架就会有通用的平台框架,那就是OPENCL。
OPENCL,Open Computing Language,它是一种通用的并行计算框架,支持主流的显卡平台,甚至是FPGA平台。但相对来说,通用的技术在某些平台上是无法与专业的技术相比的,也就是性能较低。而且由于支持不同的硬件,可能在环境安装与支持上,都有一些特殊的要求,特别是可能由于硬件驱动的支持不到位使得相关的最新硬件支持不好。一些特殊的硬件性能无法发挥出来。而软件相关的一些细节支持也无法做到专业平台的那种尽可能的完善(比如一些调试的支持等)。
目前OPENCL的更高级方向是 Vulkan Compute 和 SYCL(基于C++的高层抽象),在前面学习intel oneAPI时,给大家一笔带过这个技术。
CUDA的优势正是OPENCL的劣势,同时,大量的AI框架和数据计算平台等都天然的支持CUDA,这也是CUDA的一个最大的应用优势。
五、总结
不管哪种技术,哪种平台和框架,不要硬要比出一个优劣。要通晓其自身的特点,应用场景,在哪种场景上能发挥其优势,在哪种情况下可以替代应用?开发者需要做知已(自己的应用场景需要什么)知彼(各种并行框架的特点和其优势),找出最恰到好处的结合点,来完成自己的任务。
老生常谈,最合适的才是最好的。