学习资料
2026 夏季 InfiniTensor 训练营 CUDA 编程 1:并行编程导论与 CUDA 入门
发表于:

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

7 月 13 日, 2026 夏季 InfiniTensor 大模型与人工智能系统训练营 CUDA 编程方向第一课《并行编程导论与 CUDA 入门》开讲。本节课将从零开始,带你理解并行计算的核心概念、CPU 与 GPU 的架构差异,并通过一个向量加法的实战案例,掌握 CUDA 编程的基本流程与性能优化思维。

课程定位与前置要求

本课程专为 “从小白到专业” 的学习路径设计,即使你没有并行编程背景也能跟上。但为了保证学习效果,有两点前置建议:

  1. C++ 是必须的:CUDA 是强实践导向的课程,编写 CUDA 程序需要 C++ 环境。
  2. 计算机体系结构(加分项):如果学过计算机系统或体系结构,理解会更快;没学过也没关系,课程会覆盖所有必要知识点。

💡 学习建议:本系列课程像“搭积木”一样由易到难。动手实践的效果远胜于光听光看,请务必跟随课程编写代码。此外,本课也是后续大模型推理、通信与并行、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 推出的并行计算平台和编程模型。

四大关键特性

  1. 宿主语言:C/C++(复用系统编程技能,门槛低)。
  2. 异构协作:CUDA 程序通常由 Host(CPU) 发起,并与 GPU 协同完成计算。
  3. SIMT 模式:Single Instruction Multiple Threads(单指令多线程),同一指令被多个线程同时执行。
  4. 自动调度:开发者指定参数,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 之间的数据传输(需显式指定方向,如 cudaMemcpyHostToDevicecudaMemcpyDeviceToHost)。

性能分析:用数据说话

实验结果对比

配置 耗时 (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% 的时间都花在了 cudaLaunchKernel API 调用上。
  • 核函数发射开销远大于实际计算时间。
  • 反复从 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 并行计算开发流程。

关注与交流