1. 它解决什么问题?

有些任务包含大量可以同时执行的重复计算,例如:

  • 图像中的每个像素都需要进行相同处理
  • 大量矩阵元素需要执行乘法和加法
  • 深度学习中需要进行大量张量运算
  • 科学计算中需要处理海量数据

如果只使用 CPU 逐个处理,计算速度可能不够快。

CUDA 的核心思路是:

让 CPU 负责整体控制,让 GPU 负责大量并行计算。

这种 CPU 和 GPU 协同工作的方式,就叫作异构计算。

2. 什么是异构计算?

“异构”表示系统中存在不同类型、擅长不同工作的处理器。

在 CUDA 中,主要有两类处理器:

处理器主要特点适合的工作
CPU核心较少,但单个核心能力强,擅长复杂控制操作系统、程序流程、任务调度
GPU包含大量计算核心,擅长同时处理大量相似任务矩阵运算、图像处理、向量计算

可以把它们简单理解为:

  • CPU:项目经理
  • GPU:拥有大量工人的计算团队

CPU 负责决定“做什么、什么时候做”,GPU 负责“同时完成大量重复工作”。

3. CUDA 在异构计算中的作用

CUDA 是 NVIDIA 提供的并行计算平台和编程模型。

它主要帮助程序完成三件事:

  1. 在 CPU 上准备数据和任务
  2. 把适合并行处理的任务交给 GPU
  3. 从 GPU 获取计算结果并继续后续流程

整体过程可以表示为:

CPU 准备数据
    ↓
把数据传给 GPU
    ↓
GPU 并行计算
    ↓
把结果传回 CPU
    ↓
CPU 继续处理

这里:

  • CPU 所在的一侧通常称为 Host
  • GPU 所在的一侧通常称为 Device

本次只需要理解二者的职责分工,具体的 CUDA 编程方式后续再学习。

4. 一个简单例子:处理一百万个数字

假设要给一百万个数字分别加上 10。

使用 CPU

CPU 可以依次处理:

第 1 个数字 + 10
第 2 个数字 + 10
第 3 个数字 + 10
...
第 1000000 个数字 + 10

使用 GPU

GPU 可以让大量计算单元同时处理:

计算单元 1 处理第 1 个数字
计算单元 2 处理第 2 个数字
计算单元 3 处理第 3 个数字
...

每个数字执行的操作都相同,因此非常适合 GPU 并行处理。

关键不在于“GPU 能处理任意任务”,而在于:

任务是否能够拆分成大量相互独立、操作相似的小任务。

5. 什么任务适合 GPU?

适合 GPU 的任务通常具有以下特点:

  • 数据量很大
  • 每个数据元素执行相似操作
  • 不同数据之间依赖较少
  • 可以拆分为许多独立的小任务

例如:

  • 向量加法
  • 矩阵运算
  • 图像滤波
  • 视频处理
  • 深度学习训练
  • 物理模拟

不太适合 GPU 的任务通常具有以下特点:

  • 分支逻辑非常复杂
  • 任务之间存在严格的先后依赖
  • 数据量很小
  • 频繁在 CPU 和 GPU 之间传输少量数据

例如,一个需要不断根据上一步结果决定下一步操作的任务,可能更适合 CPU。

6. 为什么 GPU 不一定更快?

使用 GPU 需要付出额外成本。

数据通常需要经历:

CPU 内存 → GPU 内存 → GPU 计算 → CPU 内存

如果计算量很小,但数据传输次数很多,传输时间可能超过计算节省的时间。

因此,使用 GPU 是否有效,取决于:

并行计算带来的收益
>
数据传输和任务调度带来的开销

例如:

  • 对 10 个数字做简单加法:GPU 可能不划算
  • 对数百万个数字进行复杂计算:GPU 通常更有优势

7. CUDA 异构并行计算的核心流程

可以把一次 CUDA 异构计算概括为以下步骤:

  1. CPU 准备任务

    • 创建或读取输入数据
    • 确定需要执行的计算
  2. 将数据发送给 GPU

    • 把 GPU 需要的数据传输到设备端
  3. GPU 执行并行计算

    • 多个计算单元同时处理不同数据
  4. 获取计算结果

    • 将结果传回 CPU,或继续留在 GPU 上参与后续计算
  5. CPU 处理后续流程

    • 输出结果
    • 进行控制判断
    • 启动下一阶段任务

8. 常见误解

误解一:GPU 一定比 CPU 快

不一定。

GPU 的优势是大规模并行计算,而不是所有类型的计算都更快。

误解二:使用 CUDA 就等于自动并行

不完全正确。

CUDA 提供了并行计算能力,但程序仍然需要合理设计任务划分、数据传输和计算流程。

误解三:只要数据量大,就适合 GPU

不一定。

如果数据之间存在复杂依赖,或者数据传输成本很高,即使数据量很大,也可能无法获得理想性能。

误解四:CPU 和 GPU 是互相替代的

不是。

在典型 CUDA 程序中,CPU 和 GPU 是协作关系:

  • CPU 负责控制和调度
  • GPU 负责密集型并行计算

9. 总结

CUDA 异构并行计算的核心可以概括为:

CPU 负责控制,GPU 负责大规模并行计算,二者协同完成任务。

判断一个任务是否适合使用 CUDA,主要看三点:

  1. 是否有大量数据需要处理
  2. 是否能拆分成许多相似且相互独立的小任务
  3. GPU 计算收益是否足以抵消数据传输成本
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐