设计取舍
前七部分按代码讲机制,每一章都顺带碰到一些「这样做换来了什么、付出了什么」。这一部分只有一页,把它们收到一起:每一条先说选择,再说收益和代价,数字取自本卷某一页的实验,链接指向那一页,这里不重讲机制。前面没有量过的一项(开的后端越多,burn-dispatch 编译多久、二进制多大)这一页补了一个实验。对照的对象有两个:0.21 的泛型写法(只读源码和提交记录,0.21 不在离线缓存里,没有编译对照)和 candle 0.11.0(只读源码)。
- 设计取舍:八条取舍。后端从类型参数变成
Device上的值,每个小 op 多几十纳秒,后端和设备的错误从编译期挪到运行期;编译代价从用户 crate 挪进burn-dispatch,按开启的后端数成倍增长;autodiff 成了设备上的标记;Autodiff、Fusion 是类型装饰器,Router、Remote 是通道,0.22 里能套成什么样由分派表写死;惰性加融合让逐元素链快到 6 倍,错误和计时都跟着推迟;cubecl 让一份内核源码编到六种目标并支撑融合,代价是自己维护一套编译器;冷缓存的第一次 matmul 要几秒;和 candle 逐项对照。
flowchart TB opm[算子主线] --> t1["后端是运行期的值"] t1 --> t2["编译代价在 dispatch"] opm --> t4["装饰器与通道"] opm --> t5["惰性加融合"] t5 --> t6["自写 GPU 语言"] t6 --> t7["JIT 与 autotune"] adm[求导主线] --> t3["autodiff 是标记"] t1 --> cmp["对照 candle 0.11"] t5 --> cmp t6 --> cmp
💬 关联讨论
发起讨论加载中...