| 月份 | 方向① 编译优化 (鸿蒙/安卓) | 方向② 内存管理 (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页技术笔记,回答:“模型加载触发的缺页中断次数,是否与模型文件大小成正比?” |
| 月份 | 方向① 编译优化 | 方向② 内存管理 | 方向③ 端侧推理 |
|---|---|---|---|
| 第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的分数,画一张优化等级-性能曲线图。 |
“分配器微调”:修改tcmalloc或jemalloc的线程缓存大小参数,跑同一个多线程程序,统计内存分配耗时变化。 |
“推理自动化”:写一个脚本,自动循环跑100次推理,记录每次的延迟和内存峰值,输出最大值/最小值/中位数。 |
| 第7月 | “交叉①+②”:在运行Benchmark时,用/usr/bin/time -v记录最大常驻内存(RSS),分析编译优化等级如何影响编译器自身的内存占用。 |
“交叉②+③”:在手机推理过程中,用adb shell top监控系统整体内存压力,分析GC是否因内存紧张而更频繁触发。 |
“交叉③+①”:在CPU-only模式下跑推理,用perf统计指令数(instructions) 与CPU周期数,分析量化后的模型是否受益于CPU的SIMD指令优化。 |
| 第8月 | “最终交付”:提交一份3页以内的实验报告 + 一个可运行的演示脚本 + 一段3分钟的口头汇报视频(手机录屏即可)。 | 同上,但侧重内存维度。 | 同上,但侧重推理维度。 |