第一章:CUDA入门——GPU计算概述、CUDA架构简介、开发环境搭建

各位同学好,我是你们这门课的老朋友。今天咱们聊聊CUDA入门的第一章。说实话,每次带新人入门,我都要反复强调一个观点:别把GPU当成玄学,它就是个干活特别快的工具。我在项目中见过太多人,一上来就写核函数,结果连GPU和CPU怎么配合都没搞明白——嗯,那代码跑起来,比CPU还慢。

1.1 GPU计算概述:为什么我们需要它?

先问个问题:你写程序时,有没有遇到过这种情况?

  • 一个循环要跑几百万次,CPU累得气喘吁吁
  • 处理一张4K图片,要等好几秒
  • 训练神经网络,一个epoch要跑一天

这些场景,说白了就是数据量大、计算密集、但逻辑简单。CPU是几个强力的“特种兵”,适合处理复杂任务;GPU是成千上万个“普通士兵”,适合干重复的体力活。

核心概念:GPU不是用来取代CPU的,而是和CPU协同工作。CPU负责控制流和复杂逻辑,GPU负责大规模并行计算。我习惯把CPU叫“大脑”,GPU叫“肌肉”。

举个例子。我在做图像处理项目时,需要把一张1920×1080的图片每个像素做颜色校正。CPU一个一个像素处理,要几十毫秒;GPU一次性启动上万个线程,每个线程处理一个像素,几毫秒就搞定。你想想看,这差距有多大?

1.2 CUDA架构简介:GPU到底长什么样?

CUDA是NVIDIA推出的并行计算平台。说白了,它让你能用C/C++直接操作GPU。我刚开始学CUDA时,最困惑的就是它的硬件架构。这里我画了一张图,帮你理清思路。

CUDA 硬件架构与软件模型对应关系 GPU (设备) SM (流多处理器) 对应:线程块 (Block) 包含: • 多个CUDA核心 • 共享内存 • 寄存器文件 SM (流多处理器) 对应:线程块 (Block) 包含: • 多个CUDA核心 • 共享内存 • 寄存器文件 SM (流多处理器) 对应:线程块 (Block) 包含: • 多个CUDA核心 • 共享内存 • 寄存器文件 线程 线程 线程 线程 线程 线程 线程 线程 线程 线程束 (Warp) = 32个线程 线程束 (Warp) = 32个线程 软件模型:Grid → Block → Thread | 硬件模型:GPU → SM → CUDA Core

这张图我画了好一会儿。你看,软件模型和硬件模型是一一对应的:

  • Grid(网格):对应整个GPU,包含所有线程块
  • Block(线程块):对应SM(流多处理器),一个SM可以同时处理多个Block
  • Thread(线程):对应CUDA核心,每个核心执行一个线程
  • Warp(线程束):32个线程为一组,这是GPU调度和执行的最小单位

我的经验:刚开始写CUDA时,我总把Block数量设得特别大,觉得越多越快。结果发现性能反而下降了。为什么?因为SM数量是有限的,Block太多会导致排队。后来我学会了:Block数量 = SM数量 × 2,这个经验公式在大多数场景下都管用。

1.3 CUDA开发环境搭建(Linux/Windows)

好了,理论说完了,咱们动手吧。搭建环境这事儿,我踩过不少坑,今天把最稳的步骤告诉你。

1.3.1 检查硬件

首先,你得有一块NVIDIA显卡。怎么查?

  • Linux:终端输入 lspci | grep -i nvidia
  • Windows:打开设备管理器,查看显示适配器

如果显示的是NVIDIA GeForce、Quadro或Tesla系列,恭喜你,可以继续。如果是集成显卡或者AMD显卡,嗯...建议换台电脑。

1.3.2 安装NVIDIA驱动

驱动是基础,没有它,GPU就是个摆设。

Linux(Ubuntu为例):

# 添加NVIDIA驱动PPA
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

# 查看推荐驱动版本
ubuntu-drivers devices

# 安装推荐驱动(通常是最新版本)
sudo apt install nvidia-driver-550

# 重启
sudo reboot

# 验证安装
nvidia-smi

Windows:

  1. 访问NVIDIA官网,下载GeForce Experience或手动选择驱动
  2. 运行安装程序,选择“自定义安装”,勾选“清洁安装”
  3. 安装完成后重启
  4. 打开命令提示符,输入 nvidia-smi 验证

我曾经踩过的坑:在Linux上装驱动时,我直接去NVIDIA官网下载了.run文件来装。结果和系统自带的nouveau开源驱动冲突,导致黑屏。后来我学乖了:先用包管理器装,实在不行再手动装。手动装之前,一定要先禁用nouveau。

1.3.3 安装CUDA Toolkit

驱动装好了,接下来装CUDA Toolkit。这里面包含了编译器nvcc、CUDA库和开发工具。

Linux:

# 下载CUDA 12.x(以12.4为例)
wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run

# 运行安装程序
sudo sh cuda_12.4.0_550.54.14_linux.run

# 安装时注意:不要勾选Driver(因为我们已经装过了)
# 只勾选CUDA Toolkit和CUDA Samples

# 配置环境变量
echo 'export PATH=/usr/local/cuda-12.4/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 验证安装
nvcc --version

Windows:

  1. 从NVIDIA官网下载CUDA Toolkit安装包(.exe格式)
  2. 运行安装程序,选择“自定义安装”
  3. 取消勾选“Driver components”(驱动已装)
  4. 安装完成后,系统会自动添加环境变量
  5. 打开命令提示符,输入 nvcc --version 验证

1.3.4 验证环境:写个Hello World

环境搭好了,咱们写个最简单的CUDA程序试试手。

// hello.cu
#include <stdio.h>

__global__ void helloFromGPU() {
    printf("Hello from GPU! Thread ID: %d\n", threadIdx.x);
}

int main() {
    printf("Hello from CPU!\n");
    
    // 启动内核:1个Block,5个线程
    helloFromGPU<<<1, 5>>>();
    
    // 等待GPU执行完成
    cudaDeviceSynchronize();
    
    return 0;
}

编译和运行:

# Linux
nvcc hello.cu -o hello
./hello

# Windows(Visual Studio命令行)
nvcc hello.cu -o hello.exe
hello.exe

如果看到输出:

Hello from CPU!
Hello from GPU! Thread ID: 0
Hello from GPU! Thread ID: 1
Hello from GPU! Thread ID: 2
Hello from GPU! Thread ID: 3
Hello from GPU! Thread ID: 4

恭喜你,环境搭建成功!

我的建议:初学者别急着用IDE。我习惯先用命令行编译,这样能清楚看到每一步发生了什么。等你熟悉了nvcc的编译流程,再用Visual Studio或VS Code的插件也不迟。

1.4 本章小结

这一章我们聊了:

  • GPU为什么快——因为它有成千上万个核心,适合并行计算
  • CUDA的软硬件架构——Grid、Block、Thread对应GPU、SM、CUDA Core
  • 环境搭建——驱动、Toolkit、验证程序,一步都不能少

说实话,第一章的内容看起来简单,但它是后面所有章节的基础。我见过太多人,环境没搭好就开始写复杂的核函数,结果出了问题都不知道是代码的锅还是环境的锅。所以,花点时间把环境搞扎实,后面会省很多事。

下一章,咱们会深入聊聊CUDA编程模型的核心——线程层次结构和内存模型。到时候我会分享一个我调优时踩过的“共享内存”大坑,保证让你印象深刻。

可可精品资料库