第一讲:课程导论与并行计算基础

各位同学好,我是这门课的主讲。今天咱们聊聊并行计算那些事儿。

说实话,我刚开始接触并行计算时,也觉得这东西离自己很远。直到有一次,我接手了一个图像处理项目——单张图片处理要3秒,客户要求每秒处理30帧。嗯,那时候我才真正意识到:串行计算的天花板,真的触手可及。

1.1 并行计算:为什么要学它?

并行计算,说白了就是「多个人干一件事」。你想想看,一个任务如果拆成10份,10个人同时做,理论上能快10倍。当然,实际没这么理想——拆任务、合并结果都需要时间。

我个人的习惯是,把并行计算分成三个层次来看:

  • 任务级并行:多个独立任务同时跑。比如一边渲染视频,一边编译代码。
  • 数据级并行:同一操作作用在不同数据上。比如对一万个像素点同时做颜色变换。
  • 指令级并行:CPU内部同时执行多条指令。这个咱们程序员控制得少,硬件帮你做了。

咱们这门课,重点在数据级并行——因为GPU最擅长的就是这个。

核心观点:并行计算不是银弹。如果一个任务本身是串行的(比如算斐波那契数列第N项),强行并行只会更慢。选对场景,比什么都重要。

1.2 Flynn分类法:给并行计算分个类

Flynn分类法,是1972年提出的。别看它老,现在依然管用。它根据「指令流」和「数据流」的数量,把计算机分成四类:

分类 指令流 数据流 典型代表
SISD 普通单核CPU
SIMD GPU、向量处理器
MISD 容错系统(很少见)
MIMD 多核CPU、集群

咱们重点看SIMD。GPU就是典型的SIMD架构——一条指令,控制成百上千个线程,对不同的数据做同样的操作。

我曾经犯过一个错:在GPU上写了一个if-else分支特别多的内核。结果呢?性能还不如CPU。为什么?因为SIMD架构下,分支会导致「线程束分化」——一部分线程在干活,另一部分在等待。说白了,就是有人摸鱼,整体效率就下来了。

避坑指南:在GPU编程中,尽量避免线程束内的分支。如果实在避免不了,确保分支内的线程数量是32的倍数(一个线程束的大小)。

1.3 GPU架构简介:它凭什么这么快?

GPU和CPU的设计哲学完全不同。CPU是「全能选手」——什么都能干,但一次只能干几件事。GPU是「专业选手」——只会干一件事,但一次能干成千上万件。

来看一个典型的GPU架构:

  • 流多处理器(SM):GPU的核心计算单元。一个GPU有几十到上百个SM。
  • CUDA核心:SM内部的简单计算单元。每个SM有几十到几百个。
  • 共享内存:SM内部的高速缓存,容量小(几十KB),但速度极快。
  • 全局内存:GPU的显存,容量大(几GB到几十GB),但延迟高。

我记得第一次看NVIDIA的架构图时,觉得密密麻麻的。后来我总结了一个口诀:「SM是工厂,CUDA核心是工人,共享内存是工作台,全局内存是仓库。」

数据从仓库搬到工作台上,工人们快速处理,再搬回仓库。这个搬运过程,就是咱们编程时要重点优化的地方。

个人经验:我习惯先估算「计算密度」——每个数据元素需要多少次算术操作。如果计算密度低(比如只是复制数据),那瓶颈就在内存带宽上。这时候优化内存访问模式,比优化计算本身更有效。

1.4 CUDA与OpenMP概述:两个好搭档

CUDA和OpenMP,是咱们这门课的两个主角。它们解决的问题不同,但可以完美配合。

CUDA:NVIDIA推出的并行计算平台。它让你能用C/C++写GPU程序。核心概念包括:

  • 内核函数:在GPU上执行的函数,用__global__修饰。
  • 线程层次:线程→线程块→网格。一个内核启动,会创建成千上万个线程。
  • 内存层次:全局内存→共享内存→寄存器。越靠近计算单元,速度越快,容量越小。

OpenMP:CPU上的并行编程标准。它用编译器指令(#pragma omp)来标记并行区域。简单说,就是告诉编译器:「这段代码,帮我用多线程跑。」

我为什么要把这两个放在一起讲?因为实际项目中,很少有纯GPU或纯CPU的场景。我做过一个金融风险计算系统:

  • 用OpenMP把数据分块,交给不同的CPU核心处理
  • 每个CPU核心再把计算密集的部分,通过CUDA交给GPU
  • 最后用OpenMP汇总结果

这种混合编程模式,能充分利用CPU和GPU各自的优势。CPU擅长控制逻辑和串行任务,GPU擅长大规模并行计算。

一句话总结:CUDA负责「大力出奇迹」,OpenMP负责「统筹调度」。两者结合,才是高性能计算的正确打开方式。

1.5 课程路线图

这门课共30章,咱们会从基础讲到实战。大致分三个阶段:

  1. 基础篇(1-10章):CUDA编程模型、内存管理、线程同步。学完能写简单的GPU程序。
  2. 进阶篇(11-20章):性能优化、流处理、多GPU编程。学完能写出高效的并行代码。
  3. 实战篇(21-30章):OpenMP+CUDA混合编程、实际项目案例。学完能独立解决复杂问题。

每一章我都会放一些我在项目中踩过的坑。嗯,这些坑,你们迟早也会遇到。提前知道,能省不少时间。

学习建议:别只看不练。我建议每学完一章,都动手写代码。哪怕只是把示例代码跑通,也比看十遍书有用。环境配置方面,NVIDIA的官方文档写得很清楚,照着来就行。

好,第一讲就到这里。下一讲,咱们会深入CUDA编程模型,写第一个真正的GPU程序。到时候见。