1.1 课程说明
正好手边有一台Jetson设备,怀揣着好奇心我打算学一下cuda并加入了NVIDIA开发者社区举办的春训营活动。
1.1.1 面向对象
- CUDA/GPU系统开发者
- 使用CUDA/GPU并行计算系统的科研工作者
1.1.2 课程目标
- CUDA/GPU并行计算系统的分析,设计,开发,调试和优化方法;
- GPU并行计算系统的分析能力,编程能力(APOD);
- 能够通过看API手册之类的,自行进步以从事GPU开发职业。
APOD开发模型,即:Assess(评估), Parallelize(并行), Optimize(优化), Deploy(部署)。直接的说, 它适合将已有的老代码, 改成CUDA加速版本的过程,并不适合从头开始的新设计和开发的CUDA项目。实际上CUDA开发手册前面一直在说, 如何有效的将一个老项目, 进行CUDA化改造和CUDA加速。
学会将串行编程的思维转变成并行编程的思维,从用一个CPU进行编程的逻辑转变为充分利用CPU+GPU硬件资源进行编程的逻辑。
1.1.3 什么是CUDA?
CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的通用并行计算平台和程序模型,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员可以使用C语言来为CUDA架构编写程序,所编写出的程序可以在支持CUDA的处理器上以超高性能运行。
CUDA的软件环境允许开发者使用C++等高级编程语言开发程序。如下图所示,它支持其他语言、应用程序编程接口或基于指令的方法,例如 FORTRAN、DirectCompute、OpenACC。
多核 CPU 和超多核 (manycore) GPU 的出现,意味着主流处理器进入并行时代。当下开发应用程序的挑战在于能够利用不断增加的处理器核数透明地扩展程序的并行性,例如 3D 图像应用可以透明地拓展其并行性来适应内核数量不同的 GPUs 硬件。CUDA并行程序模型主要为克服这一挑战而设计,其核心包含三个关键抽象(abstraction):
- 线程组的层次结构(a hierarchy of thread groups);
- 共享内存(shared memories);
- 屏障同步(barrier synchronization)
这三个抽象便可在在粗粒度的数据并行和任务并行中,嵌套细粒度(fine-grained)的数据并行和任务线程并行。
CUDA这种可扩展的程序模型允许 GPU 架构通过简单地扩展多处理器和内存分区的数量来跨越广泛的市场范围:高性能发烧友 GeForce GPU ,专业的 Quadro 和 Tesla 计算产品。
1.2 GPU架构的基本原理
1.2.1 CPU架构
CPU架构中很多芯片资源被用于内存管理、控制读写、存储,然而并没有很多资源被用于计算核心,而这也就决定了CPU固有的特性,在诸如流水线、内存管理、逻辑指令处理的优化上能有更好的表现。
1.2.2 传统单核处理器
【摩尔定律】集成芯片上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。
然而摩尔定律是迟早要失效的,常规传统单核处理器在前进的路上会遇到两堵受限于物理约束的“墙”:
- 时钟频率墙:由于能量密度越来越高,时钟频率无法保持线性增长;
- 存储器墙:存储器的读写速度、大小难以满足发展。
1.3 GPU硬件平台
现在CPU系统已经遇到各种麻烦,只能向多核及并行系统发展。GPU - Graphics Processing Unit 顺势而生。
CPU类型的内核如下图所示:
其大部分资源被用在了控制、管理等工作上,而这部分对于并行处理来说意义不大,将它们精简,并增加更多的计算核心单元就是早期GPU架构设计的基本思路。
早期GPU架构如下图所示,它保留了取译码单元(Fetch/Decode),执行上下文(Execution Contexts),并且由于存在多个计算核心,内存部分被设计为了共享模式。每一个小的计算核心单元就被称为CUDA 核,下图所示的整个一个框架在后来也被称为流多处理器(streamingMultiproeessor,SM)。每个流多处理器包含\textbf{32}个CUDA 核,它们共享相同的执行上下文以及内存。于是一个流多处理器中的CUDA核能够在物理层面真正实现并行,也把一个流多处理器中同时执行同一个指令的32个线程称作一束(Warp)。
从CPU和GPU结构上的对比可以看出,CPU控制部分居多,每一个核的计算能力可能更强;GPU有很多计算核心,虽然每个计算核心的能力可能不及CPU的计算核心,但它数量居多,对于大数据集的重复指令任务,GPU的计算优势就能够得到体现。
台积电7nm制程的Ampere架构GA100 GPU让A100在826mm的大小上拥有了542亿个晶体管,每个完整GPU有8个GPC,每个GPC有8个 TPC,每个TPC有2个SM,每个GPC有16个SM,总共128个SM。
- Acceleration for all data types, including FP16, BF16, TF32, FP64, INT8, INT4, and Binary.
- SM架构的设计可以使得CUDA代码在不同的GPU设备上通用,可扩展性很强,开发者也不需要考虑如何分配计算核。
- 优化CUDA的最好方法是更新硬件。
1.4 基于Arm和GPU的平台架构
在基于Arm和GPU的平台(Tegra)上(Jetson Nano、Jetson Orin Nano等),GPU和CPU其实共享的是同一块内存(GPU和CPU在某种程度上实现了互通)。
1.4.1 Jetson Orin模组和开发者套件
1.5 CUDA并行计算模式
CUDA并行计算模式,一句话:应用多个计算资源解决一个计算问题。
- 涉及多个计算资源或处理器;
- 问题被分解为多个离散/独立的部分,可以同时处理;
- 每个部分都由一系列指令完成;
最好是计算密集的任务:
- 通信和计算开销比例合适
- 不要受制于访存带宽
【Amdahl’s Law】对于固定负载情况下描述并行处理效果的加速比 s s s,阿姆达尔(Amdahl)经过深入研究,指出程序可能的加速比取决于可以被并行化的部分,以及并行处理器的数量。有如下公式:
s = 1 P N + S s = \frac{1}{\frac{{P}}{{N}}+{S}} s=NP+S1
P = P= P=并行部分, S = S= S=串行部分, N = N= N=处理器个数。