外观
CS149:并行计算的机制与性能
并行计算的目标,是把足够多的独立工作有效映射到硬件资源,并控制通信、同步、调度与数据移动成本。增加线程只是其中一步。一个结果正确但更慢的并行程序,仍然是很有价值的观察对象:它能揭示原先忽略的开销。
这套资料固定 Stanford CS149 Fall 2025 的课程主线,使用原创 C++17 CPU 实验,以及一个未在当前环境运行的 CUDA 归约示例。先学习机制和测量方法,再选择是否进入官方完整作业。
学习路径
| 章节 | 要解决的问题 | 可交付的练习 |
|---|---|---|
| 性能模型 | 理论上能快多少,瓶颈在哪里? | Amdahl、work/span、Roofline 数字分析 |
| CPU、SIMD 与任务调度 | 任务怎么切,谁执行,粒度多大? | 串行/静态/动态三策略对照 |
| 同步与内存一致性 | 正确共享数据与低成本共享为何不同? | 原子领取任务、假共享布局实验 |
| GPU 与归约 | 线程如何映射到设备、怎样同步与访存? | 阅读并验证可选 CUDA 归约 |
| 实验与实测 | 怎样确认正确,怎样解释时间? | 本机结果、复现命令、扩展任务 |
| 复习与迁移 | 如何把这些方法用于系统和大模型? | 任务图、融合与性能诊断 |
前置知识是 C/C++ 数组、指针、函数、基本线程概念,以及 CSAPP 缓存 与 同步。不需要先掌握某一套 GPU API,但应能区分带宽、延迟、吞吐量,以及逻辑任务与操作系统线程。
课程年份与官方作业的对应
Fall 2025 官方页面 的编程作业包括 CPU 性能分析、任务图调度、CUDA 圆形渲染、Trainium2 卷积与池化融合,以及 CUDA kernel 优化。本套资料深入前两类的核心机制,并讲清 GPU 和专用加速器的执行模型;不要求获得 Stanford 机房或 Trainium2 资源,也不复刻这些作业的完整评分答案。
| 官方入口 | 在本站的对应重点 |
|---|---|
| Assignment 1 | SIMD 利用率、工作分配、性能测量 |
| Assignment 2 | 任务抽象、线程复用、依赖图 |
| Assignment 3 | GPU 数据并行、顺序约束与同步 |
| Assignment 4 | 算子融合与数据移动的关系 |
| Assignment 5 | kernel 正确性、布局与性能迭代 |
这些仓库可能继续更新。本站不内嵌其代码,也不把当前默认分支虚构为一个固定提交;正式做官方作业时请保存所用 commit、工具链和数据集。本站原创代码随当前 Courses 仓库版本一起记录。
两个可以立刻运行的 CPU 实验
sh
make -C labs/parallel test
make -C labs/parallel benchmark-runbenchmark.cpp 用确定性整数计算模拟工作量不均衡的任务:前四分之一项更重。串行、连续静态分块和动态领取分块产生完全相同的逐元素结果,差别在任务怎样分配。
false_sharing.cpp 让每个线程只增加自己的原子计数器,对比紧密排布与 128 字节对齐排布。两个版本都正确且没有数据竞争;它们帮助区分同步语义与缓存一致性带来的性能成本。128 是实验布局参数,不是未经检测就认定的机器缓存行大小。
实际完成与硬件边界
2026-10-04,macOS arm64、Apple clang 21.0.0:两个 CPU 程序通过严格警告普通构建与 ASan/UBSan 功能测试,并保存 5 次重复性能测试的摘要。线程库返回 hardware_concurrency=10,这里只把它视为提示值,不推断物理核心或具体芯片。
本次 200000 项、4 线程、动态粒度 64 的中位时间为 17.845 ms,串行为 67.217 ms;同一输入的连续静态分块为 65.370 ms。这展示负载均衡的影响,不能保证你的机器上有相同加速。详见 实测与限制。
CUDA 文件 labs/parallel/reduction.cu 仅提供可选学习实现,本机没有执行编译与 GPU 验证,因此不报告设备性能。它使用标准块级共享内存归约,能与 CPU 串行答案比较,有 NVIDIA CUDA 环境后再按 GPU 章节运行。
学习时始终分开三种陈述:理论模型给出的上界、代码结构推断出的瓶颈、实际测量得到的证据。将三者连接起来,就是本课程希望训练的能力。