Rust in Everything
基于 burn 0.22.1

设计取舍

前七部分按代码讲机制,每一章都顺带碰到一些「这样做换来了什么、付出了什么」。这一部分只有一页,把它们收到一起:每一条先说选择,再说收益和代价,数字取自本卷某一页的实验,链接指向那一页,这里不重讲机制。前面没有量过的一项(开的后端越多,burn-dispatch 编译多久、二进制多大)这一页补了一个实验。对照的对象有两个:0.21 的泛型写法(只读源码和提交记录,0.21 不在离线缓存里,没有编译对照)和 candle 0.11.0(只读源码)。

  1. 设计取舍:八条取舍。后端从类型参数变成 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

💬 关联讨论

发起讨论
加载中...