CONTENTS / 18 + 34 CHAPTERS

一条主线,八个分册。

从基础01–18开始,再依次阅读19–52章。M1、完整G0与三座先备桥的位置由同一份路线安排。

按78个完整单元学习 →已有基础:分级与G0
The language

C++ 基础与工程

  1. 01
    第一份程序:保存、编译与顺序执行

    从终端和纯文本文件开始,逐个读懂第一份C++程序,再用两个小整数例子解释初始化、赋值、独立副本与重新编译。

    5h · 含动手
  2. 02
    类型与表达式:先运算,再保存

    从类型和字面量出发,亲手预测整数除法、初始化、转换时机、const和标量auto,最后区分无符号回绕、有符号越界与浮点舍入。

    6h · 含动手
  3. 03
    控制流:选择与重复

    先读懂条件、分支和循环的下一步,再独立完成半开区间累计与偶数计数,追踪短路、更新和提前退出。

    10h · 含动手
  4. 04
    普通函数:参数、调用与返回

    沿着一次调用追踪形参、返回值与调用者,练习默认实参、简单重载和有范围的计数函数。

    8h · 含动手
  5. 05
    引用与const:副本和同一个对象

    用具名整数追踪别名、参数写回、只读路径与借用有效期;从状态变化理解auto和局部返回。

    7h · 含动手
  6. 06
    指针:地址、空值与有效访问

    分清改目标与改指向,跟踪指针副本、可选借用、const分层和最后一次合法访问。

    7h · 含动手
  7. 07
    类与对象:状态、接口和销毁顺序

    把状态和允许的操作放进同一个类型,追踪初始化、失败不变和正常退出时的销毁过程。

    8h · 含动手
  8. 08
    拥有一组数据:array、vector与string

    从类型实参和合法下标开始,区分元素数量与预留容量,再用独立复制和溢出前检查建立可靠的序列操作。

    13h · 含动手
  9. 09
    遍历与借用:范围、视图与失效

    用同一组读数比较下标、迭代器与范围for;让视图借用已有元素,再逐步判断存活、长度、重分配和记录身份。

    9h · 含动手
  10. 10
    算法与lambda:表达处理意图

    从手动计数走到查找、排序、累计和谓词;分清调用时机、闭包持有的状态,以及算法怎样修改元素或范围。

    9h · 含动手
  11. 11
    关联容器与适配器:查找、唯一性与访问顺序

    先识别一对值与绑定方式,再区分按键查询、插入和计数;用同一批小任务比较有序集合、哈希表、双端容器、队列与栈。

    9h · 含动手
  12. 12
    复制与移动:追踪对象、调用与结果

    先区分表达式类别、const和对象寿命,再预测复制/移动构造与赋值;用标量日志和容器值理解std::move、返回值与Rule of Zero。

    7h · 含动手
  13. 13
    真实资源与RAII:独占拥有

    追踪new创建的真实对象由谁释放,再用unique_ptr管理正常退出、提前返回、转交和接口接管;分清空拥有者、有效借用与释放责任。

    8h · 含动手
  14. 14
    共享拥有与回调寿命

    用最后一个强拥有者、weak_ptr的lock以及回调自带的状态,判断对象何时仍可用;再检查C++20 std::function的空状态和可复制目标要求。

    6h · 含动手
  15. 15
    定义模板与concepts

    从会填模板实参走到定义模板,按实参推导、编译期分支与约束选择可用接口;再用转发引用解释泛型调用如何保留表达式类别。

    9h · 含动手
  16. 16
    错误处理与输入解析

    把合法零、没有值和失败分开传递:先从输入得到经过完整检查的候选值,再提交修改;用真实资源观察异常展开,并判断noexcept承诺怎样影响明确的移动选择。

    10h · 含动手
  17. 17
    多文件编译、链接与构建

    把头文件、实现与main组成真正的项目,沿预处理、编译、汇编、链接追踪产物;亲自制造缺定义和重复入口的链接错误,再用明确目标与可复现命令恢复。

    6h · 含动手
  18. 18
    测试与调试:独立定位失败

    从独立期望与实际检查次数开始,用同一处整数除法错误练习失败退出、LLDB定位、改源重编译和边界复测;分清断言被移除与检查真正执行。

    5.5h · 含动手
Problem solving

数据结构与算法

  1. 19
    数组、哈希与双指针:重复工作从哪里删掉

    两数之和与最长无重复区间,能否只扫描一遍?

    60分钟阅读
  2. 20
    二分、排序与堆:保留哪些候选

    找第一个不小于目标的位置,为什么比“找相等”更好复用?

    60分钟阅读
  3. 21
    递归、树与图:沿着依赖和边访问

    有环的图为什么不能像树一样无条件递归下去?

    60分钟阅读
  4. 22
    动态规划与解题表达:状态必须回答一句话

    最少硬币和背包为什么能复用旧答案,却不能乱改循环顺序?

    60分钟阅读
Systems

Linux 与并发系统

  1. 23
    进程、系统调用与文件描述符

    为什么一次 read 不能保证拿到完整数据,子进程又怎样把结果交回父进程?

    60分钟阅读
  2. 24
    虚拟内存、页表与 mmap

    一块连续的虚拟地址,为什么不要求连续的物理内存?

    60分钟阅读
  3. 25
    线程、互斥锁与死锁

    两个线程各做一千次加法,为什么结果与安全性都不能只靠一次运行判断?

    60分钟阅读
  4. 26
    条件变量、有界队列与关闭协议

    队列为空时消费者应该等什么,服务关闭后又怎样保证所有等待者能退出?

    60分钟阅读
  5. 27
    原子操作与 happens-before

    为什么计数用 relaxed 可以,而用 relaxed 发布普通对象却不够?

    60分钟阅读
  6. 28
    TCP 字节流、分包、超时与背压

    两次 send 为什么可能变成三次 recv,如何写出不会无界等待的接收器?

    60分钟阅读
Performance

架构、性能与并行

  1. 29
    CPU cache、缓存一致性与 SIMD

    同样读八个整数,为什么地址布局会改变需要接触的缓存行数?

    60分钟阅读
  2. 30
    可信测量、原始样本与性能模型

    一次最快的耗时能代表改进吗,如何把瓶颈假设变成可复查的实验?

    60分钟阅读
  3. 31
    并行分解、分块与负载均衡

    十个元素分给三个线程,怎样证明没有漏算、重算和越界?

    60分钟阅读
  4. 32
    Reduction、scan 与数值正确性

    求一个总和与求每个前缀为什么是不同算法,浮点结果又为何可能随顺序变化?

    60分钟阅读
  5. 33
    Host/device、传输与异步生命周期

    launch 返回后能否立即读结果,为什么数据留在设备上可能比优化一条指令更有效?

    60分钟阅读
  6. 34
    Kernel 索引、边界与 grid-stride loop

    启动十二个线程处理十个元素,剩下两个线程该做什么?

    60分钟阅读
  7. 35
    合并访问、共享内存与同步范围

    为什么线程访问相邻地址很重要,shared memory 又为什么必须配合分阶段同步?

    60分钟阅读
  8. 36
    Tensor shape、stride 与 GEMM 分块

    转置一定要复制数据吗,矩阵乘法如何通过tile复用减少搬运?

    60分钟阅读
GPU computing

AMD · HIP 与 ROCm

  1. 37
    HIP:从 CPU 数据到一次 kernel 调用

    五个数怎样经历分配、搬运、执行与验证?

    55分钟阅读
  2. 38
    Streams 与 events:用依赖组织异步工作

    两个 stream 怎样安全共享中间结果?

    55分钟阅读
  3. 39
    ROCm 各层:一次请求由谁负责

    HIP、ROCr、KFD、amdgpu 和硬件分别处理什么?

    55分钟阅读
  4. 40
    HIP Reduction:从正确性到 profiling 问题

    算出21以后,怎样判断还值得优化哪一步?

    55分钟阅读
Dataflow

Tenstorrent · 显式数据流

  1. 41
    Tensix 与 tiles:先安排数据,再安排计算

    一张小矩阵怎样变成可分配的 tile 工作?

    55分钟阅读
  2. 42
    TTNN 与 Metalium:不同抽象保留同一份数学合同

    高层一次 add 与底层三个kernel,怎样验证做的是同一件事?

    55分钟阅读
  3. 43
    Reader、compute、writer:缓冲区里的生产与消费

    一块tile何时能读,何时才能复用?

    55分钟阅读
  4. 44
    Tenstorrent 端到端例子:让每一层对同一结果负责

    怎样从两张tensor一直检查到host回读?

    55分钟阅读
Wafer-scale

Cerebras · 晶圆级计算

  1. 45
    WSE 与 PE:把数据放在拥有它的计算节点旁边

    三个PE各有两项数据,怎样得到一个全局结果?

    55分钟阅读
  2. 46
    CSL 与 host:装载、启动、回读是一份共同合同

    为什么一个局部函数还不构成可运行的设备程序?

    55分钟阅读
  3. 47
    多PE scan:消息里到底应该传什么

    局部前缀和怎样变成保持原顺序的全局前缀和?

    55分钟阅读
  4. 48
    功能模型、simulator 与硬件:分别证明什么

    测试全绿之后,哪些结论仍然不能写?

    55分钟阅读
From source to execution

Compiler 与 runtime

  1. 49
    AST、IR 与 SSA:同一个表达式的三种表示

    编译器如何把(2+3)×4变成可分析的计算关系?

    55分钟阅读
  2. 50
    优化首先要合法:别名、溢出与浮点重排

    少一次读取,为什么反而算错了?

    55分钟阅读
  3. 51
    Tensor lowering 与内存规划:值什么时候可以共用一块空间

    为什么一次看似原地的更新,编译器有时必须插入复制?

    55分钟阅读
  4. 52
    ABI、装载与 runtime:找到函数还不等于能安全调用

    编译产物怎样接上参数、设备和资源生命周期?

    55分钟阅读

进入相应主题前的三座桥