1.0 序言
本系列文章是 CUDA 学习过程中的阅读记录以及感想,用到的书籍有《CUDA 高性能并行计算》《CUDA 并行程序设计:GPU 编程指南》,同时也参阅了英伟达的指导手册。
英伟达原版文档:b9a3b355a37b4efa973e44f785a306ce-CUDACProgrammingGuide.pdf
1.1 从图形处理到通用并行计算
在市场对实时高清 3D 图形处理的不断需求之下,GPU(Graphic Processor Unit)已经具有高并发、多线程、多核(manycore , 相对于 CPU 的 multicore)、高内存带宽等特点。
GPU 与 CPU 之间在浮点运算能力上的巨大差异是由于 GPU 是专门设计用来密集、并发运算(这正是图形渲染所必需的),因此 GPU 在设计时用更多的晶体管进行数据运算而不是像 CPU 那样进行数据缓存、流程控制。
另外,GPU 时专门设计用来高性能并行计算(同样功能的线程处理许多数据元素)。因为是相同功能的线程并行执行,所以对流程控制的要求相对较低,又因为是用来处理高复杂度的数据运算,内存访问能力的重要性比缓存更高。
数据并行处理是将数据元素分发到并行处理线程。许多处理大量数据的程序都可以用并行运算模型来加速计算。在 3D 渲染中,大量的像素点和定点被分配到并行的线程。类似地,图像渲染预处理、视频编码解码、图形缩放和立体视觉、模式识别等待这样的图像和媒体处理程序可以将图像块和像素点分配到并行处理线程。事实上,从通用信号处理或者物理仿真到金融或者生物计算,这些除了图像渲染处理等算法都可以通过并行数据处理来加速。
1.2 CUDA:一个通用并行计算平台和编程模型
在 2006 年 11 月,NVIDIA 发布了 CUDA,一个使用 NVIDIA 的 GPU 来解决许多复杂运算的、远比 CPU 高效的通用并行计算平台和编程模型。
CUDA 给所有开发者提供了一个使用 C 语言做为高级编程语言的软件环境。如下图所示,CUDA 也支持 FORTRAN、DirectCompute、OpenACC 等其它语言、编程接口和直接编程方法。
1.3 一个可伸缩的编程模型
从多核(multicore)CPU 到多核(manycore)GPU,意味着现在主流的处理芯片都是并行系统。另外,它们并行能力的发展依然服从摩尔定律。挑战就是把应用程序并行化以促使核心数量的增长,就像 3D 图形处理应用那样。
CUDA 并行编程模型是设计出来使用 C 这样开发者熟悉的标准编程语言来降低学习曲线、克服这个挑战。
CUDA 的核心有三个概念:分级线程组,共享内存,屏障同步。对开发者而言,它们都是以一系列小型语言扩展库的形式出现。
这些概念提供细粒度的数据并行性和线程并行性,嵌套在粗粒度数据并行和任务并行。它们引导开发者把问题粗粒度地分配成可以用不同线程组解决的互不相关的子问题,每个子问题又分成可以在线程组内相互协作解决的子子问题。
这种分解通过允许解决每个子问题时多线程协作和自动扩展保留了语言的表现力(硬件无关性)。事实上,每个线程组都可以被以任意顺序、不论是并行还是串行地分配到同一 GPU 内的任何可用处理核心,因此一个编译好的 CUDA 程序可以运行在任意数量的处理核心之上,并且只有运行时系统才需要知道物理核心的数量,如下图所示。
GPU 是由一组流多处理器( Streaming Multiprocessors , SMs)构成,详见具体的硬件实现。一个多线程程序可以被划分到不同的互相独立的线程组,所以处理核心数量越多的 GPU 可以在越短的时间内执行完程序。
1.4 总结
GPU 更多地用来高速并行数据运算,相对于通用性更强、需要更多复杂流程控制和数据缓存的 CPU 来说,拥有更多的 ALU 单元,也需要更高的内存带宽,控制器性能相对较弱,缓存能力也不高。
CUDA 是一种通用并行运算平台和编程模型,通过高级语言扩展的形式屏蔽了底层硬件细节,开发者不需要知道程序将要运行于的 GPU 有多少处理核心、是什么架构,只有运行时系统动态分配运算核心。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于