基础软件·科研启蒙体验营(大二学生)

说明

适合谁:

你能收获:

如何加入:

你的选题和安排(每月一个微任务)

第一学期(共4个月):从“CSAPP知识”到“编译器/运行时手感”

月份 方向① 编译优化 (鸿蒙/安卓) 方向② 内存管理 (GC/分配器) 方向③ 端侧大模型推理
第1月 “从汇编看优化”:写一个sum_array函数,用gcc -O0-O2编译,对比生成的汇编(objdump -d),标出哪些指令被优化掉了(结合CSAPP第3章)。 “CSAPP malloc实战”:基于CMU的malloc实验(lab5)的手动实现版,要求跑通并画出空闲链表的指针追踪图。 “内存占用解析”:加载一个50MB的PyTorch模型,用pmap看内存布局,标出哪些段对应CSAPP第9章的“堆/共享库/栈”。
第2月 “链接的威力”:将一个C程序拆成3个.c文件编译成.o,对比静态链接(-static)和动态链接下可执行文件的大小和启动时间(time命令)。 “模拟Mark-Sweep”:用C语言实现一个基于CSAPP第9章(页表)的简易GC模拟器——用mmap分配大块内存,手动标记可达对象。 “内存分配器对决”:在手机上运行llama.cpp,用dumpsys meminfo记录推理前/中/后的内存变化,分析内存分配器(jemalloc vs glibc)的碎片差异。
第3月 “读IR”:用Clang生成LLVM IR(-emit-llvm -S),对照CSAPP第3章的x86-64汇编,逐行手写注释说明每条IR对应的汇编指令意图。 “分代GC直觉”:用Python模拟分代假说——统计一个长时间运行的程序中,新创建对象被回收的比例(用随机数模拟)。 “模型加载的缺页分析”:用perf stat -e page-faults监控模型加载过程,结合CSAPP第9章解释为什么首次推理慢于第二次。
第4月 “月度复盘+交叉初探”:提交一份1页技术笔记,回答:“-O2优化中,哪个汇编变化最让你惊讶?为什么?” “月度复盘”:提交一份1页技术笔记,回答:“你的模拟GC中,标记阶段遍历了多少内存页?如何估算?” “月度复盘”:提交一份1页技术笔记,回答:“模型加载触发的缺页中断次数,是否与模型文件大小成正比?”

第二学期(共4个月):进入“微手术+交叉融合”

月份 方向① 编译优化 方向② 内存管理 方向③ 端侧推理
第5月 “真·修改Pass”:在LLVM中给hello.c写一个函数内联(Inline)的简易Pass(参考LLVM官方文档),对比内联前后的汇编代码量。 “真·GC观察”:用jstat -gc监控一个Spring Boot微服务(可本地运行),记录GC频率与堆使用率的关系曲线。 “真·量化对比”:用llama.cpp-q参数将模型从FP32量化到INT4,对比精度损失(用同一个输入输出)和加载速度
第6月 “Benchmark自动化”:用Python脚本自动编译运行CoreMark,分别记录-O0-O1-O2-Os的分数,画一张优化等级-性能曲线图 “分配器微调”:修改tcmallocjemalloc的线程缓存大小参数,跑同一个多线程程序,统计内存分配耗时变化。 “推理自动化”:写一个脚本,自动循环跑100次推理,记录每次的延迟和内存峰值,输出最大值/最小值/中位数
第7月 “交叉①+②”:在运行Benchmark时,用/usr/bin/time -v记录最大常驻内存(RSS),分析编译优化等级如何影响编译器自身的内存占用。 “交叉②+③”:在手机推理过程中,用adb shell top监控系统整体内存压力,分析GC是否因内存紧张而更频繁触发。 “交叉③+①”:在CPU-only模式下跑推理,用perf统计指令数(instructions)CPU周期数,分析量化后的模型是否受益于CPU的SIMD指令优化。
第8月 “最终交付”:提交一份3页以内的实验报告 + 一个可运行的演示脚本 + 一段3分钟的口头汇报视频(手机录屏即可)。 同上,但侧重内存维度。 同上,但侧重推理维度。