学习资料
InfiniTensor 冬季训练营 CUDA 编程方向第一课《并行编程导论与 CUDA 入门》
发表于:

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编程流程

  1. Host端准备数据:在CPU上初始化数据
  2. 数据传输:将数据从Host内存复制到Device内存
  3. GPU计算:调用核函数执行并行计算
  4. 结果传输:将计算结果从Device内存复制回Host内存
  5. 内存释放:释放GPU内存

CUDA编译与运行

  1. CUDA代码需使用NVIDIA提供的NVCC编译器编译,而非普通C++编译器。
nvcc -o addcuda addcuda.cu
./addcuda
  1. 编译架构
  • Host代码:使用普通C++编译器编译
  • Device代码:编译为特定GPU架构的二进制代码

架构兼容性:通过-arch-code参数指定目标GPU架构,实现跨架构兼容。

性能分析与优化

  1. 性能测试

以向量加法为例,对比不同线程配置的性能:

配置 CPU时间(ms) GPU时间(ms) 加速比
1线程 8.15 2680 0.003
256线程 8.15 0.049 166
满载线程 8.15 0.006 1358

关键发现:线程数增加显著提升性能,但核函数调用开销不可忽视。

  1. 优化策略:线程级循环

将循环移入核函数内部,减少核函数调用次数:

__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代码的调试。

  1. 使用方法
nvcc -g -G -o vectoradd vectoradd.cu
cuda-gdb vectoradd
  1. 常用命令:
  • run:运行程序
  • break:设置断点
  • next/n:执行下一行
  • print/p:打印变量值
  • info cuda threads:查看CUDA线程信息

结语

CUDA作为GPU并行计算的主流框架,为深度学习、科学计算等领域提供了强大的计算能力。通过本课程的学习,你已掌握了CUDA编程的基础知识,包括线程组织、内存管理、核函数编写等核心概念。

接下来,我们将深入探讨更高级的主题,如矩阵运算优化、内存访问优化、CUDA性能分析工具NCU等。这些内容将帮助你真正掌握CUDA编程,实现高效的并行计算。

学习建议

  1. 从简单示例开始,逐步增加复杂度
  2. 重视性能分析,了解瓶颈所在
  3. 多动手实践,编写、编译、运行、调试

后续课程将深入讲解大模型训练、推理与优化技术,包括模型微调、分布式训练、性能优化等高级主题。

💡 学习贴士

更多细节及完整课程内容,请观看直播或查看课程回放。

链接:https://www.infinitensor.com/camp/winter2025

📚 训练营报名持续进行中

扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名