Rust in Everything
基于 tenferro-runtime 0.8.0

全景

这一部分先回答「tenferro 为什么有四种张量、它和 ndarray、faer、burn、candle 差在哪」,再把直接计算主线和 traced 主线各从头到尾走一遍,后面各章都从这里出发。实验都在 CPU 上,engine 用串行的 CpuEngine::serial() 和不同宽度的 threadteam 池对照。

  1. tenferro 解决什么问题:README 的定位和「Is tenferro for You?」四条落在哪,README 里的 WebGPU 说法已经过时;TypedTensor、Tensor、EagerTensor、TracedTensor 是「静态还是动态 dtype」和「直接、eager、traced」两根轴的组合,最后都借同一种 engine;f64 + f32 在直接运算里报错,在 eager 和 traced 里被提升;和 ndarray、faer、burn、candle 只对照能核实的部分;一个只做 CPU matmul 的二进制 30.3 MB。
  2. 一次 matmul:lldb 看到运算在主线程上执行,matmul 经 CpuEngine::dot_general_read、cpueinsum 的二元计划、tcontract 的 faer 策略落到 faer;每次新建串行 engine 多 3 µs,每次新建 12 线程 engine 最快 26 µs,换成专用池要 0.3 ms(threadteam 的池缓存);8 线程比 12 线程快;Accelerate 版绕过 tcontract 直达 cblas_dgemm,1024 时快 13 倍。
  3. 一次 grad:y = Σx² 的图有 3 个片段 2 个运算,grad 图 4 个运算,编译后去重剩 3 个;记图、求导、编译、prepare 都在几十到一百多微秒;n = 3 时一次 run 约 4 µs,串行和 8 线程一样;同一个梯度用 eager 求一遍对照。
flowchart TB
  why["tenferro 解决什么问题"] --> mm["一次 matmul"]
  why --> gr["一次 grad"]
  mm --> tensor["02 张量"]
  mm --> cpu["03 CPU 后端"]
  gr --> rt["04 图与运行时"]
  gr --> ad["05 自动微分"]
  why --> ops["06 运算族"]

💬 关联讨论

发起讨论
加载中...