
2026 年 1 月 12 日,2025 冬季 InfiniTensor 大模型与人工智能系统训练营 CUDA 编程方向第一节课《并行编程导论与 CUDA 入门》正式开讲。
在深度学习、科学计算等高性能计算领域,"并行"已成为提升计算效率的关键技术。面对日益增长的数据量和计算需求,传统的串行编程已难以满足性能要求。本节课我们将从基础概念出发,带你了解并行编程的核心思想,并深入学习CUDA这一GPU并行计算的主流框架。本节课无需并行编程背景,但是有C++前置基础要求,有需要的同学可以在官网关注上周《编程基础课》系列课程回放。
串行、并发与并行:概念辨析
串行:任务按顺序依次执行,一个任务完成后再执行下一个。
并发:多个任务交替执行,但同一时刻只有一个任务在运行。
并行:多个任务同时执行,同一时刻有多个任务在运行。并行在同一个时间点上可以同时处理多个任务,从而实现更高的吞吐量和效率。
CPU并行与GPU并行:硬件设计差异
1. CPU:全能型战士
- 设计目标:处理复杂逻辑和控制流
- 硬件特点:少量复杂核心,复杂的控制单元,追求低延迟
- 典型应用:操作系统、Web服务等需要复杂控制的场景
2. GPU:流水线工人
- 设计目标:高效处理大规模数据并行计算
- 硬件特点:大量简单核心,简单的控制单元,追求高吞吐
- 典型应用:深度学习、图形渲染、科学计算等大规模数据并行场景
为什么选择GPU进行深度学习计算?
深度学习任务需要大量重复的矩阵运算,GPU的"以量取胜"特性使其成为理想选择,通过大量简单核心的并行工作,实现远超CPU的计算效率。
CUDA:统一计算设备架构
CUDA(Compute Unified Device Architecture)是NVIDIA开发的并行计算平台和编程模型,使开发者能在NVIDIA GPU上进行并行编程。
1. CUDA的核心特点:
- 宿主语言:C/C++,降低学习门槛
- CPU与GPU协作:CPU负责控制逻辑,GPU负责计算密集型任务
- SIMT模型:Single Instruction Multiple Thread,一个指令被多个线程同时执行
- 自动调度:通过参数设置,CUDA自动调度和优化GPU资源
2. CUDA编程模型:Host与Device
- Host(主机端):CPU端,运行主程序和控制逻辑
- Device(设备端):GPU端,执行计算密集型任务
3. 内存管理
- Host Memory:CPU的主存(RAM)
- Device Memory:GPU的全局内存(Global Memory)
数据在Host和Device之间的传输是CUDA编程的重要环节,需要通过特定API完成。
CUDA线程层级结构
CUDA采用三层结构组织线程:
- Grid:整个并行计算的最高层级,包含多个Block
- Block:Grid的子集,包含多个Thread
- Thread:最小的执行单元,每个Thread执行相同指令
线程唯一标识:通过公式
blockIdx * blockDim + threadIdx可计算任意线程的唯一索引
CUDA核函数
核函数是CUDA中在GPU上执行的函数,需要使用__global__标识符标记。
__global__ void addKernel(float *a, float *b, float *c, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
c[idx] = a[idx] + b[idx];
}
}
关键点:
- 核函数在GPU上执行
- 通过线程索引
idx确定每个线程处理的数据位置 - 使用
if语句确保线程索引不超过有效数据范围
CUDA编程流程
- Host端准备数据:在CPU上初始化数据
- 数据传输:将数据从Host内存复制到Device内存
- GPU计算:调用核函数执行并行计算
- 结果传输:将计算结果从Device内存复制回Host内存
- 内存释放:释放GPU内存
CUDA编译与运行
- CUDA代码需使用NVIDIA提供的NVCC编译器编译,而非普通C++编译器。
nvcc -o addcuda addcuda.cu
./addcuda
- 编译架构
- Host代码:使用普通C++编译器编译
- Device代码:编译为特定GPU架构的二进制代码
架构兼容性:通过
-arch和-code参数指定目标GPU架构,实现跨架构兼容。
性能分析与优化
- 性能测试
以向量加法为例,对比不同线程配置的性能:
| 配置 | CPU时间(ms) | GPU时间(ms) | 加速比 |
|---|---|---|---|
| 1线程 | 8.15 | 2680 | 0.003 |
| 256线程 | 8.15 | 0.049 | 166 |
| 满载线程 | 8.15 | 0.006 | 1358 |
关键发现:线程数增加显著提升性能,但核函数调用开销不可忽视。
- 优化策略:线程级循环
将循环移入核函数内部,减少核函数调用次数:
__global__ void addKernelLoop(float *a, float *b, float *c, int n, int step) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
for (int i = 0; i < step; i++) {
if (idx + i < n) {
c[idx + i] = a[idx + i] + b[idx + i];
}
}
}
优化后性能显著提升:
- 1线程配置:从2680ms降至69.58ms
- 256线程配置:从0.049ms降至0.00688ms
CUDA调试工具:CUDA GDB
CUDA GDB是NVIDIA提供的调试工具,支持对Host和Device代码的调试。
- 使用方法
nvcc -g -G -o vectoradd vectoradd.cu
cuda-gdb vectoradd
- 常用命令:
run:运行程序break:设置断点next/n:执行下一行print/p:打印变量值info cuda threads:查看CUDA线程信息
结语
CUDA作为GPU并行计算的主流框架,为深度学习、科学计算等领域提供了强大的计算能力。通过本课程的学习,你已掌握了CUDA编程的基础知识,包括线程组织、内存管理、核函数编写等核心概念。
接下来,我们将深入探讨更高级的主题,如矩阵运算优化、内存访问优化、CUDA性能分析工具NCU等。这些内容将帮助你真正掌握CUDA编程,实现高效的并行计算。
学习建议:
- 从简单示例开始,逐步增加复杂度
- 重视性能分析,了解瓶颈所在
- 多动手实践,编写、编译、运行、调试
后续课程将深入讲解大模型训练、推理与优化技术,包括模型微调、分布式训练、性能优化等高级主题。

💡 学习贴士
更多细节及完整课程内容,请观看直播或查看课程回放。
链接:https://www.infinitensor.com/camp/winter2025
📚 训练营报名持续进行中
扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名
