2026 夏季 InfiniTensor 训练营 CUDA 编程 1:《并行编程导论与 CUDA 入门》

7 月 13 日, 2026 夏季 InfiniTensor 大模型与人工智能系统训练营 CUDA 编程方向第一课《并行编程导论与 CUDA 入门》开讲。本节课将从零开始,带你理解并行计算的核心概念、CPU 与 GPU 的架构差异,并通过一个向量加法的实战案例,掌握 CUDA 编程的基本流程与性能优化思维。
课程定位与前置要求
本课程专为 “从小白到专业” 的学习路径设计,即使你没有并行编程背景也能跟上。但为了保证学习效果,有两点前置建议:
- C++ 是必须的:CUDA 是强实践导向的课程,编写 CUDA 程序需要 C++ 环境。
- 计算机体系结构(加分项):如果学过计算机系统或体系结构,理解会更快;没学过也没关系,课程会覆盖所有必要知识点。
💡 学习建议:本系列课程像“搭积木”一样由易到难。动手实践的效果远胜于光听光看,请务必跟随课程编写代码。此外,本课也是后续大模型推理、通信与并行、OpenCL、Triton 等进阶课程的基石。
核心概念:串行 vs 并发 vs 并行
在深入 GPU 之前,我们必须厘清三个容易混淆的概念:
| 概念 | 英文 | 生活类比 | 核心特点 |
|---|---|---|---|
| 串行 | Sequential/Serial | 1 个接待员,办完第1个人的事才办第 2 个 | 严格顺序、强阻塞性 |
| 并发 | Concurrent | 1 个接待员,轮流处理多人任务(如让 A 填表时去处理 B) | 有顺序但非完全阻塞,单核切换 |
| 并行 | Parallel | 4 个接待员,同时处理4个人的事 | 真·同时进行,吞吐量翻倍 |

为什么我们需要并行?
答案很简单:最大化吞吐量和处理效率。在计算机科学中,我们主要通过两种方式实现并行:
- CPU 并行:依靠多物理核心(如 8核CPU),常用于操作系统调度、Web 服务等复杂逻辑场景。
- GPU 并行:依靠海量简化核心,常用于科学计算、图形渲染、深度学习。
全能战士 CPU vs 流水线工人 GPU

理解硬件差异是写好 CUDA 代码的前提。
CPU:Central Processing Unit
- 定位:全能战士,擅长复杂逻辑、控制流和调度。
- 特点:少量复杂核心 + 复杂控制单元 + 低延迟。
- 设计目标:让单个任务尽快完成,避免系统卡顿。
GPU:Graphics Processing Unit
- 定位:流水线工人,最初为图形渲染设计,现广泛用于 AI。
- 特点:大量简化核心 + 简单控制单元 + 高吞吐。
- 设计目标:三个臭皮匠顶个诸葛亮,通过海量核心同时处理简单任务。
以 NVIDIA A100 为例,其内部由多个 SM (Streaming Multiprocessor) 组成,每个 SM 内包含多个 CUDA Core(通用计算单元)。
CUDA 编程模型与硬件映射
CUDA (Compute Unified Device Architecture) 是 NVIDIA 推出的并行计算平台和编程模型。
四大关键特性
- 宿主语言:C/C++(复用系统编程技能,门槛低)。
- 异构协作:CUDA 程序通常由 Host(CPU) 发起,并与 GPU 协同完成计算。
- SIMT 模式:Single Instruction Multiple Threads(单指令多线程),同一指令被多个线程同时执行。
- 自动调度:开发者指定参数,CUDA 自动在后台进行资源调度和优化。

内存与运行流程
CUDA 程序遵循 Host (CPU) 与 Device (GPU) 的交互模型:
- Host Memory:CPU 端内存(RAM)
- Device Memory:GPU 端全局内存(Global Memory)
- 连接:通过总线 (Bus)通信

实战:从 CPU 加法到 GPU 加法

1. 文件与编译
- CPU 代码:
.cpp/.cc,使用g++编译 - CUDA 代码:
.cu,必须使用nvcc(NVIDIA CUDA Compiler) 编译
NVCC 编译流程:分离 Host/Device 代码 → Device 代码编译为 PTX/Fatbin → Host 代码用 g++ 编译 → 链接生成可执行文件。
2. 线程层级结构

CUDA 使用三级架构组织线程:
- Grid:一次 Kernel 启动所包含的全部 Thread Block 的集合
- Block:Grid 的划分单元
- Thread:最小运算单位
线程唯一索引公式:
int index = blockIdx.x * blockDim.x + threadIdx.x;
3. Kernel 函数定义与调用
// 核函数定义:使用 __global__ 标识
__global__ void addKernel(float* C, const float* A, const float* B, int N) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < N) {
C[idx] = A[idx] + B[idx];
}
}
// Host端调用:使用 <<<GridDim, BlockDim>>> 语法
addKernel<<<gridDim, blockDim>>>(d_C, d_A, d_B, N);
4. 关键 API
cudaMalloc/cudaFree:设备端内存分配与释放。cudaMemcpy:Host 与 Device 之间的数据传输(需显式指定方向,如cudaMemcpyHostToDevice或cudaMemcpyDeviceToHost)。
性能分析:用数据说话
实验结果对比
| 配置 | 耗时 (ms) | 加速比 (vs CPU) | 备注 |
|---|---|---|---|
| CPU 单线程 | ~8.0 | 1.0x | 基准 |
| GPU 1 线程/block | ~2680 | 0.117x | 比 CPU 慢 8 倍 |
| GPU 256 线程/block | ~0.049 | 1185x | 显著提升 |
| GPU 满载 | ~0.006 | 1350x | 接近峰值 |
为什么 1 线程反而更慢?
使用 Nsight Systems (nsys) 分析发现:
- 在 1 线程配置下,97.6% 的时间都花在了
cudaLaunchKernelAPI 调用上。 - 核函数发射开销远大于实际计算时间。
- 反复从 Host 端启动 Kernel 的开销是主要的性能杀手。
优化方案:Grid-Stride Loop
将外部循环移入 Kernel 内部,减少 Kernel 发射次数:
__global__ void addKernelStride(float* C, const float* A,
const float* B, int N, int stride) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
// 在 kernel 内部通过步长循环处理多个元素
for (int i = idx; i < N; i += stride) {
C[i] = A[i] + B[i];
}
}
优化效果:1 线程配置耗时从 2680ms 降至 69.58ms,验证了“减少 Kernel 发射次数”策略的有效性。
⚠️ 重要发现
即使优化后,单线程 GPU 仍比 CPU 慢。GPU 的优势在于大规模并行的高吞吐,而非单核性能。此外,cudaMemcpy 的传输耗时往往远超 Kernel 计算本身,这是后续课程优化的重点。
实用工具与技巧
获取设备信息

版本查看
nvcc --version:查看实际使用的 CUDA Toolkit 版本。nvidia-smi显示的版本:仅代表驱动支持的最高版本,不等于当前实际使用的 CUDA 版本。
调试:CUDA-GDB
编译时需添加 -g -G 标志:
nvcc -g -G add.cu -o add_cuda
- g:生成 Host 端调试信息。
- G:生成 Device 端调试信息。
监控 GPU 状态
重点关注 GPU Utilization、显存占用、功率及进程列表。
📝 课后 FAQ
Q: 只学过 C 可以吗?
A: 理论上可以,但强烈建议补充 C++ 基础(先导课有提供相关资源)。
Q: X、Y、 Z 有限制,所以我们需要在代码中明确指定X、Y、 Z 三个方向吗?
A: 目前示例仅使用了 X 维度,若使用 XYZ 三维需明确设置。
Q: Grid-Stride Loop 到底是什么?
A: 当一个 Grid 无法一次处理完所有数据时,在 Kernel 内部通过步长循环处理剩余数据,避免在 Host 端反复发射 Kernel 带来的巨大开销。
Q: 作业和往年一样吗?
A: 每季作业都会更新,请在第三节课后关注最新作业发布通知。
加入训练营
InfiniTensor 官网报名/听课: [https://www.infinitensor.com]
视频号直播: InfiniTensor 官方视频号
B站直播: InfiniTensor 官方直播间
答疑交流: 训练营官方社群⬇️

Description
2026 夏季 InfiniteTensor 大模型与人工智能系统训练营 CUDA 入门第一课,详解串行/并发/并行核心概念、CPU 与 GPU 架构差异及 SIMT 编程模型;通过向量加法实战案例演示 Kernel 编写、内存管理与 Nsight Systems 性能分析,涵盖 Grid-Stride Loop 优化、CUDA-GDB 调试等实用技巧,零基础掌握 GPU 并行计算开发流程。
关注与交流

