CUDA编程快速入门学习计划

目标:2-4周快速入门CUDA编程,能够编写简单的GPU加速程序


一、学习环境准备

1.1 免费GPU环境(可选本地/云端)

环境 说明 链接
Google Colab 免费GPU(P100/K80),无需配置 https://colab.research.google.com/
Kaggle 免费GPU,每周20小时 https://www.kaggle.com/
本地NVIDIA显卡 需要安装CUDA Toolkit -

1.2 本地安装(如果有NVIDIA显卡)

1
2
3
4
5
# 1. 下载CUDA Toolkit
# https://developer.nvidia.com/cuda-downloads

# 2. 验证安装
nvcc --version

二、快速学习计划

计划A:7天速成(每天2-3小时)

天数 内容 目标
Day 1 CUDA编程模型、Hello World 理解CUDA基本概念
Day 2 线程模型、内存管理 理解Grid/Block/Thread
Day 3 向量加法实战 编写第一个CUDA程序
Day 4 矩阵乘法 理解二维并行
Day 5 内存优化 理解共享内存、constant内存
Day 6 性能分析工具 学会使用nvprof/Nsight
Day 7 项目实战 完成一个完整的CUDA项目

计划B:14天学习(每天1-2小时)

周次 内容 目标
Week 1 CUDA基础(视频+文档) 理解CUDA编程模型
Week 2 实战练习(3-5个例子) 能够独立编写CUDA程序

三、每日学习内容

Day 1:CUDA基本概念

学习内容:

  1. GPU vs CPU 架构区别
  2. CUDA编程模型(Host vs Device)
  3. 第一个CUDA程序

Hello World 代码:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
__global__ void hello() {
printf("Hello from GPU!\n");
}
int main() {
hello<<<1, 1>>>();
cudaDeviceSynchronize();
return 0;
}

参考资料:


Day 2:线程模型

学习内容:

  1. Thread、Block、Grid概念
  2. 线程索引计算(threadIdx、blockIdx)
  3. 线程束(warp)概念

核心公式:

1
2
3
4
5
6
7
// 一维索引
int idx = blockIdx.x * blockDim.x + threadIdx.x;

// 二维索引
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
int idx = row * width + col;

Day 3:向量加法(实战1)

目标: 实现两个向量的加法

1
2
3
4
5
6
7
8
9
10
__global__ void vectorAdd(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];
}
}

int main() {
// 分配内存、拷贝数据、调用kernel、同步...
}

练习:

  • 修改block大小,观察性能变化

Day 4:矩阵乘法(实战2)

目标: 实现矩阵乘法(理解二维并行)

1
2
3
4
5
6
7
8
9
10
11
12
__global__ void matrixMul(float *A, float *B, float *C, int N) {
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;

if (row < N && col < N) {
float sum = 0;
for (int k = 0; k < N; k++) {
sum += A[row * N + k] * B[k * N + col];
}
C[row * N + col] = sum;
}
}

Day 5:内存优化

学习内容:

  1. 全局内存(global memory)
  2. 共享内存(shared memory)
  3. 常量内存(constant memory)
  4. 纹理内存(texture memory)

核心概念:

  • 合并访问(coalesced access)
  • bank conflict
  • 内存预取

Day 6:性能分析

工具:

工具 说明
nvprof 命令行性能分析
Nsight Systems 图形化timeline分析
Nsight Compute CUDA kernel分析
1
2
# 使用nvprof
nvprof ./vectorAdd

Day 7:项目实战

推荐项目(选一个):

项目 难度 说明
图像卷积 ⭐⭐ 基础项目
矩阵运算优化 ⭐⭐ 进阶项目
并行排序 ⭐⭐⭐ 高级项目
稀疏矩阵乘法 ⭐⭐⭐ 挑战项目

四、必读教程

4.1 官方文档(推荐)

文档 链接 说明
CUDA C++ Programming Guide https://docs.nvidia.com/cuda/cuda-c-programming-guide/ 必读
CUDA Best Practices Guide https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/ 性能优化
CUDA Samples https://github.com/NVIDIA/cuda-samples 示例代码

4.2 在线教程

教程 链接 说明
NVIDIA官方入门 https://developer.nvidia.com/cuda-education 免费课程
CUDA C++ Tutorial https://www.youtube.com/watch?v=fg2sTBtcJq0 视频教程

4.3 中文教程

教程 链接
CUDA编程入门 - 知乎 https://zhuanlan.zhihu.com/p/34587739
CUDA教程 - CSDN https://blog.csdn.net/

五、实战练习题

5.1 基础练习

序号 练习 目标
1 Hello World 理解CUDA基本语法
2 向量加法 理解线程索引
3 向量点积 理解归约操作
4 矩阵转置 理解内存访问模式
5 矩阵乘法 理解二维并行

5.2 进阶练习

序号 练习 目标
6 图像模糊(卷积) 理解2D卷积
7 并行归约 理解warp级别优化
8 内存优化 使用共享内存优化

六、面试常见问题

6.1 基础问题

问题 答案要点
GPU vs CPU的区别 并行 vs 串行,显存vs内存
CUDA编程模型 Host + Device,kernel函数
threadIdx/blockIdx 线程索引计算
warp 32个线程为一warp,SM执行单位

6.2 进阶问题

问题 答案要点
合并访问 coalesced memory access
bank conflict 共享内存访问冲突
occupancy SM利用率
stream 并发kernel执行

七、学习成果检验

7.1 能独立完成

  • 编写向量加法CUDA程序
  • 编写矩阵乘法CUDA程序
  • 使用nvprof分析性能
  • 优化内存访问模式

7.2 面试能回答

  • CUDA编程模型
  • 线程索引计算
  • 内存访问优化
  • warp和occupancy概念

八、资源汇总

8.1 必备收藏

资源 链接
CUDA官方文档 https://docs.nvidia.com/cuda/
CUDA官方入门课程 https://developer.nvidia.com/cuda-education
CUDA Samples https://github.com/NVIDIA/cuda-samples
Google Colab https://colab.research.google.com/

8.2 学习路线图

1
2
3
4
5
6
7
Day 1-2: 概念 + Hello World

Day 3-4: 基础实战(向量、矩阵)

Day 5-6: 优化 + 性能分析

Day 7: 项目实战

🎯 总结

学习目标:

  • 2周内完成CUDA入门
  • 能够编写简单的GPU加速程序
  • 理解基本的性能优化方法

核心技能:

  • 理解CUDA编程模型
  • 掌握线程索引计算
  • 学会使用nvprof分析性能

祝学习顺利!