Skip to content

配套实验与代码 ​

网站可以直接阅读讲义、搜索和操作交互模型。下面的实验在你自己的电脑运行;源码页和下载包由仓库内同一份代码自动生成。先运行基线,再改动一个条件,最后解释观察结果。

下载与环境 ​

课程需要的环境阅读与下载
操作系统Python 3.10+;官方 xv6 另需 RISC-V 工具链和 QEMU源码 · 下载
CSAPPC11 编译器、make、POSIX 系统源码 · 下载
分布式Python 3.10+ 标准库源码 · 下载
并行计算C++17 编译器、make、线程库;CUDA 为可选内容源码 · 下载
语言模型Python 3.10+、NumPy;CPU 即可源码 · 下载

下载包解压后是课程目录(例如 csapp/)。网站示例命令以整个仓库根目录为起点;只下载单门课程时,相应进入解压目录,省略命令中的 labs/课程名/。Windows 建议用 WSL2 执行 POSIX C/C++ 实验。

完整仓库中可以统一准备和检查:

sh
python3 -m venv labs/llm/.venv
labs/llm/.venv/bin/python -m pip install -r labs/llm/requirements.txt
PYTHON=labs/llm/.venv/bin/python npm run test:labs

npm run test:labs 执行三组 Python 测试和两组 CPU C/C++ 测试,不启动训练、不编译 CUDA,也不下载上游课程。若系统 Python 已有 NumPy,可以直接运行该命令。

操作系统:追踪映射与写时复制 ​

sh
python3 labs/os/models.py
python3 -m unittest discover -s labs/os -p 'test_*.py' -v

观察父子进程先共享一个物理页,子进程写入后分裂成两个物理页,退出后全部回收。模型覆盖 Sv39 地址解析、权限检查、2 MiB 大页、引用计数、COW、内存不足和 copyout。然后回到 2025 实验路线,按九个独立实验导读定位真正的 xv6 文件、修改路径与官方测试。

学习验收:不看实现,解释为什么只读代码页不能一遇写 fault 就变成可写页,以及为什么内核向用户缓冲区写数据也要处理 COW。

CSAPP:从位到并发 ​

sh
make -C labs/csapp test
make -C labs/csapp sanitize

六个 C 程序覆盖位表示、带 LRU 的缓存模拟、arena 分配器、子进程与信号、生产者消费者、最小 shell。先读 实验地图,再用断言、调试器和 sanitizers 验证修改。最小 shell 不包含完整的作业控制;分配器用于观察分裂与合并,不替换系统 malloc。

学习验收:为缓存构造一条冲突 trace;为分配器构造一次必须合并左右空闲块才能成功的申请;解释 fork 后为何应在父进程处理 cd。

分布式:让故障出现得可控 ​

sh
python3 -m unittest discover -s labs/distributed -p 'test_*.py' -v
python3 labs/distributed/raft_model.py

固定五节点 Raft/KV 模型由测试显式驱动选举、复制、分区和重启。它实现当前任期提交限制和请求去重;日志保存在 Python 进程内,没有真实 RPC 与磁盘持久化。参考 故障实验,在恢复前先预测哪些日志能被覆盖、哪些不能。

学习验收:一次超时写随后成功提交,客户端重试为什么不能生成新 request ID?五节点只剩两节点互通,为什么不能把“当前在线节点”重新当作全体成员计算多数派?

并行计算:先对答案,再看时间 ​

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

调度实验对比串行、静态连续分块与动态分块;布局实验观察相邻原子计数器与增加间距后的耗时。每次都检查结果,时间包含线程创建与回收。机器负载、编译选项和输入分布会改变结论,实测口径见 性能实验。

CUDA 归约附有源码,需要合适的 NVIDIA GPU、驱动和编译工具链。当前交付中尚未运行这部分,不将 CPU 测试通过算作 GPU 验证。

语言模型:真正做一次训练 ​

sh
python3 -m unittest discover -s labs/llm -p 'test_*.py' -v
python3 labs/llm/train.py --steps 300
python3 labs/llm/generate.py --prompt "the fox " --tokens 100

使用系统 Python 或将上述 python3 换成刚建立的虚拟环境解释器。微型 decoder-only Transformer 使用 NumPy 手写前向与反向,包含 RoPE、RMSNorm、SwiGLU、因果注意力和 AdamW。原创短句语料、训练日志与曲线一并提供;默认字符 tokenizer,也可以切换字节 BPE。

先阅读 CS336 实验手册,解释标签为什么右移、因果掩码阻止了什么、梯度检查在比较哪两个量。短语料上损失下降只是训练链路的验证,不代表模型已具备通用语言能力。

所有实际运行记录与未执行范围见 验证记录。