Skip to content

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 1SIMD 利用率、工作分配、性能测量
Assignment 2任务抽象、线程复用、依赖图
Assignment 3GPU 数据并行、顺序约束与同步
Assignment 4算子融合与数据移动的关系
Assignment 5kernel 正确性、布局与性能迭代

这些仓库可能继续更新。本站不内嵌其代码,也不把当前默认分支虚构为一个固定提交;正式做官方作业时请保存所用 commit、工具链和数据集。本站原创代码随当前 Courses 仓库版本一起记录。

两个可以立刻运行的 CPU 实验 ​

在线查看配套源码 · 下载并行计算实验代码。

sh
make -C labs/parallel test
make -C labs/parallel benchmark-run

benchmark.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 章节运行。

学习时始终分开三种陈述:理论模型给出的上界、代码结构推断出的瓶颈、实际测量得到的证据。将三者连接起来,就是本课程希望训练的能力。