1. 课程导入与高性能科学计算全景
高性能科学计算(High-Performance Scientific Computing)不是“把程序跑得更快”这么简单,它研究的是一类特定问题:当物理、化学、生物、气象、工程仿真等领域的问题被离散化为数值模型后,如何让这些模型在真实硬件上以可接受的时间与成本得到可信结果。本课程的目标,是帮助你把“科学计算问题”翻译成“计算架构上的执行方案”,并用可度量的性能指标判断方案是否有效。
先建立学习路径的整体认识。课程大致沿三条线推进:第一条是问题线,从偏微分方程离散、稠密/稀疏线性代数、N 体与谱方法等典型负载出发,理解它们的计算与访存特征;第二条是架构线,从单核流水线、缓存层次、SIMD,到多核、NUMA、GPU 与互连网络,理解硬件如何提供算力与带宽;第三条是优化线,包括算法选择、数据布局、循环变换、并行分解、通信规避与性能建模。三条线最终交汇于同一个判断:某个负载在某个架构上,瓶颈究竟在浮点、在带宽、在延迟,还是在并行开销。
从科学问题到计算架构的映射
映射关系可以用一个具体例子说明。考虑二维热传导方程,采用五点差分格式在 N×N 网格上离散,每个内点每步更新为四个邻居的平均值。这个数学描述映射到计算上,就是“对二维数组做 stencil 扫描”:每次更新读取 5 个双精度数、写入 1 个,做约 4 次浮点运算。于是可以立刻估算算术强度(Arithmetic Intensity,每字节内存流量对应的浮点运算次数):约 4 FLOP / (6×8 Byte) ≈ 0.083 FLOP/Byte。这个数值远低于现代处理器的机器平衡点(例如某 CPU 峰值 500 GFLOP/s、可持续带宽 100 GB/s 时约为 5 FLOP/Byte),因此该负载几乎必然受内存带宽约束,优化重点应是分块(blocking)提升缓存复用,而不是一味增加并行线程。
相反,若问题变成两个 N×N 稠密矩阵相乘,每个输出元素需要 N 次乘加,数据复用潜力大,算术强度随分块显著上升,此时浮点性能成为主约束,优化重点转向向量化、寄存器分块与多核并行。可见,“问题→架构”的映射并非凭经验,而是由计算模式与访存模式的比值决定的。
三个核心性能指标及其含义
浮点性能通常以每秒浮点运算次数(FLOP/s)度量,工程上更关心“实测值占峰值的比例”。峰值可由“核心数 × 每周期浮点指令数 × 频率”估算,例如 16 核、每核每周期 16 个双精度 FLOP、3.0 GHz,理论峰值约 768 GFLOP/s。实测若只有 120 GFLOP/s,占比约 16%,就要追问:是向量化未生效、是访存受限,还是并行负载不均。
内存带宽以 GB/s 度量,反映单位时间能搬运的数据量。对 stencil 这类低算术强度负载,实测带宽往往直接决定运行时间。可用 STREAM 类基准测出可持续带宽,再与理论带宽(如 DDR5 多通道配置)对比,得到有效利用率。若某次 stencil 实测仅达到可持续带宽的 40%,常见原因是跨步访存、缓存冲突或 NUMA 远端访问。
并行效率定义为加速比除以并行度,即 E = S / P,其中 S = T₁ / T_P。例如单线程 100 s、16 线程 8 s,则 S = 12.5,E ≈ 78%。效率下降可能来自串行段(Amdahl 定律)、同步开销、负载不均或内存带宽争用。需要注意,强扩展(固定问题规模、增加线程)与弱扩展(问题规模随线程同比例增长)回答的是不同问题,报告结果时应明确说明。
一个可操作的入门练习
建议在进入后续章节前完成一次小型测量,建立“数据说话”的习惯。以二维 stencil 为例,用 C 或 Fortran 实现单精度与双精度两个版本,网格取 2048×2048,迭代 100 次,分别用 1、2、4、8 线程运行,记录时间并计算:
算术强度 AI ≈ (每次更新 FLOP) / (每次更新字节数)
实测带宽 BW = 总访存字节 / 运行时间
加速比 S(P) = T(1) / T(P)
并行效率 E(P) = S(P) / P
观察结果时重点看三件事:双精度版本时间是否约为单精度的两倍(说明受带宽约束);线程数增加后带宽是否趋于饱和(说明已触及内存墙);效率是否随 P 增大而明显下降(说明存在同步或带宽争用)。这些观察将成为后续学习分块、向量化与并行分解的动机。