
【免费下载链接】BoothOpen-source CUDA, Triton and HIP compiler targeting multiple GPU and CPU architectures.项目地址https://gitcode.com/gh_mirrors/bar/Booth点击查看免费下载Booth是一款开源的 CUDA、Triton 与 HIP 编译器能把熟悉的 GPU 内核源码直接编译到 AMD、NVIDIA 以及 Tenstorrent 数据流 GPU 等多种架构。它内部有一层叫TDFTile DataFlow瓦片数据流的中间表示专门负责把一颗 CUDA 内核拆分成region区域、channel通道与 arc弧并编排 Tenstorrent 芯片上的 NoC 片上网络与 L1 循环缓冲区。本文带你读懂这套编排机制。为什么用「港口」打比方因为 region 就是一个个码头channel 是码头之间的传送带NoC 是连接码头的航道。数据瓦片tile在它们之间流转和港口装卸货物的节奏一模一样。为什么需要 TDF 层编译器里的「中间层」Tenstorrent 的 GPU 和 NVIDIA/AMD 很不一样它不是靠成千上万个线程并行而是把任务摊在多个「Tensix」单元上每个单元由几个 RISC-V 小核心分工协作。这就没法直接套用传统的「一个 kernel 跑满所有线程」的思路。Booth 为此在核心 IRBIR之上加了 TDF 这一层。一句话概括它的职责把一个__global__CUDA 内核变成一张「区域通过通道通信」的图再落到具体硬件上。对AMD / NVIDIA这张图会「塌缩」成一个区域原样交给已有后端几乎零开销。对TenstorrentTensix图会展开成「一个 baby core 一个区域」通道变成 L1 里的循环缓冲区弧变成内联的 NoC CB循环缓冲操作。这一层的设计词汇刻意借鉴了大型机世界区域像 CICS 事务、通道像 TPF 循环块表、弧像由信号量强制执行的 ENQ/DEQ 配对。这些模式 1968 年就用来跑航空订票系统如今搬到了 GPU 上。更多背景见 docs/mainframe.md。三大核心概念Region、Channel、ArcTDF 的全部家当就是下面三样东西它们一起构成一张数据流图。定义都集中在 tdf.h 中。概念结构体一句话解释类比港口Region 区域td_rgn_t一个带角色的小程序绑定一个 baby core有自己的 L1 工作区一个码头Channel 通道td_chan_t两个区域间的循环缓冲区带深度与瓦片形状码头间的传送带Arc 弧td_arc_t区域在某个点发出的一次同步/搬运操作传送带上的一次装卸动作Region三种角色各司其职一个区域是一个「事务性程序」带一个角色、绑定一个 baby core还有一块 L1 工作存储TWA。Tensix 的标准角色有三种外加一个用于非 Tenstorrent 后端的 SOLORDRreader读取者负责 NoC → L1把数据从显存搬进本地缓存。CMPcompute计算在 T0/T1/T2 核心上做真正的 FPU/SFPU 计算。WRTwriter写入者负责 L1 → NoC把结果搬回显存。SOLO单区AMD/NVIDIA 后端的退化形态整个内核就是一个区域。这种「读—算—写」分工正是 Tenstorrent 数据流 GPU 的精髓搬运和计算由不同核心流水线式地同时进行谁也不用等谁。Channel带「标签」的循环缓冲区通道是连接两个区域生产者 → 消费者的环形缓冲depth表示环里一次能放几个瓦片l1_off字段由放置阶段稍后填上。每条通道都带一个tag标签像 Burroughs 描述符一样打包了瓦片的三要素形状rows × cols默认 32×32数据类型fp32 / bf16 / int 等布局跨 DRAM bank 交织、按某轴分片、或固定在某块 L1这样一旦生产者和消费者的形状/类型对不上模块构建时就会触发断言而不是运行期静默错乱。Arc六种「动作」一条弧就是某区域在 body 里某个位置要发出的一个 CB 或 NoC 操作。它记录了来源的 BIR 指令下标bir_inst锚点以便把同步调用插到区域指令流的正确位置。共有六种分成两类见 tdf.h弧类型对应操作作用RSVcb_reserve_back生产者等待有空闲槽位PUSHcb_push_back生产者把瓦片提交进通道WAITcb_wait_front消费者阻塞直到瓦片就绪POPcb_pop_front消费者把槽位还给生产者RDnoc_async_readNoC 异步读显存 → L1WRnoc_async_writeNoC 异步写L1 → 显存前四种是「生产者/消费者」的握手信号后两种跨 L1/显存边界。这就是整条数据流水线的「节拍器」。从 CUDA 到三分裂fission 如何拆解内核fission裂变是 TDF 层最关键的变换源码在 tdf_fission.c。它把一个「单区 SOLO」模块原地改写成 RDR/CMP/WRT 三区流水线分类指针参数遍历内核的每条 load/store把地址追溯回它来自哪个参数标成「输入被读」或「输出被写」。为每个输入参数建一条RDR→CMP通道并配上RD / PUSH / WAIT三条弧——读取者从显存拉瓦片推送给计算区。为每个输出参数建一条CMP→WRT通道配PUSH / WAIT / WR三条弧——计算区把结果推进通道写入者再经 NoC 排回显存。举个典型例子矩阵乘法matmul(C, A, B, ...)有两个读参数A、B和一个写参数C。裂变后得到3 条通道、9 条弧每个通道 3 条弧。这个形状在测试 tests/ttdf.c 里被逐项断言连noc0 len4096、noc1 len4096这样的字节数都精确校验。一个参数如果既被读又被写比如saxpy的x a*x y原地更新就会同时拿到进、出两条通道。L1 放置循环缓冲区怎么排进缓存有了图和通道还得决定每个通道在 L1 里放哪儿。这由placement放置路径完成见 tdf_place.c。Wormhole B0 的 L1 共1464 KiB从0x00000000开始组织成 16 个 bank。整块 L1 的布局像切蛋糕前 32 KiB留给代码 栈TD_L1_CODE_RSV。再往下 256 Bruntime args 区宿主在 dispatch 前写入 CUDA 坐标内建量threadIdx等和标量参数布局契约在 rt_args.h。CB 区各通道的瓦片数据 8 字节 FIFO 头从TD_L1_CB_BASE向上按声明顺序「首次适配」打包每段都按16 字节对齐NoC 读写 L1 要求 C16 对齐否则瓦片会悄悄错位损坏。顶部 64 KiB__shared__区从 L1 顶端向下生长。它和 CB 区之间用td_shbase()隔开谁也不能越界。如果通道装不下比如深度失控放置会直接报错拒绝而不是默默溢出。默认瓦片是 32×32 fp32 4096 字节这个数会一路影响到 NoC 对齐、CB 深度和 runtime args。NoC 编排读走哪条、写走哪条芯片上有两条物理 NoC流向相反。编排路径 tdf_noc.c 对每条RD/WR弧做两件机械但关键的事选网络读走NoC 0它的流向正好契合 Tensix→显存的读取方向写走NoC 1反向类比。这是依据 Tenstorrent 路由文档得出的经验规则。算长度每次传输的字节数 瓦片字节数并拒绝超过 8 KiBTD_NOC_MAX_XFER的单次请求。更大的传输要等一个「切分 pass」在那之前宁可大声失败也不静默截断——「响亮的失败胜过安静的损坏」。它同时暴露一个64 位 NoC 地址编码器td_noc_addr把 36 位本地地址放在低 36 位6 位 X 坐标放[41:36]6 位 Y 坐标放[47:42]高位保留。这套位布局直接来自 Wormhole 的 NoC 内存映射规范。从 IR 到 RISC-V弧如何落地成指令最后弧要被翻译成 baby core 能执行的 RISC-V 指令CB 弧发射器td_emit_cb_arc把RSV/WAIT/PUSH/POP降成 RISC-V 原语等待是本地自旋信号则是对对方 L1 里某个计数器做 NoC 原子自增。搬运循环td_emit_dma_loop则是读取者/写入者内核的「机器码形态」从 runtime args 区读出显存基址和瓦片数然后逐瓦片循环——先做 CB 门控等待空槽/等数据经 NoC 传输一块瓦片等 barrier 落定再推送/释放槽位最后推进指针并在到达环尾时回卷到环首。这个回卷动作正是「循环缓冲区在干活」。这些 RISC-V 原语都封装在 src/tensix/noc.hTensix 后端在 src/tensix/ 里消费它们最终产出 reader/compute/writer 三份 baby-core ELF。实战一行命令查看 TDF 布局想亲眼看看自己内核的 TDF 图不用翻源码编译二进制造成的kath就有现成开关完整命令参考见 docs/usage.md# 打印 TDF 布局regions、channels、NoC arcs ./kath --tdf kernel.cu # 再进一步跑完 fission 裂变看三区流水线 ./kath --tdf-fission kernel.cu输出是纯文本、一行一项的人类可读形式td_dump比如TDF module (targetTENSIX) regions: 3 channels: 3 arcs: 9 region 0: RDR coreB x0 y0 region 1: CMP coreT0 region 2: WRT coreNC chan 0: rgn0 - rgn1 tile 32x32 fINTRL depth2 l10x8100 arc 2: rgn1 PUSH chan0 cnt1 bir[11]这张「地图」让你一眼看清数据从哪个区域流到哪个区域、走哪条 NoC、每跳多少字节——排查数据流问题时非常有用。关键源码与文档索引想深入按下面这张表顺藤摸瓜即可想了解什么去哪里看TDF 层总体设计、常量与位布局src/tdf/tdf.h建图 API、查询与 dumpsrc/tdf/tdf.c目标感知的 lowering单区塌缩 / 多区展开src/tdf/tdf_lower.c内核裂变指针分类 三区重建src/tdf/tdf_fission.cL1 放置通道打包与预算src/tdf/tdf_place.cNoC 编排、地址编码、CB/DMA 发射src/tdf/tdf_noc.cbaby-core NoC 传输与信号量原语src/tensix/noc.hruntime args 布局契约src/tensix/rt_args.hTensix 后端常量与 SFPU 指令src/tensix/tensix.hTDF 形状与集成测试39 项tests/ttdf.c大型机风味特性含 TDF 简介docs/mainframe.md小结Booth 的 TDF 层是它理解 Tenstorrent 数据流 GPU 的「翻译官」。核心就三样region划分角色、channel承载瓦片、arc控制节拍。配合fission 裂变、L1 放置和NoC 编排三步一颗普通的 CUDA 内核就能被拆成读—算—写流水线稳稳落到 RISC-V baby core 上。对想搞懂「数据流 GPU 到底怎么把数据搬来搬去」的人来说./kath --tdf就是最好的入门窗口——先看这张图再读源码水到渠成。赞分享【免费下载链接】BoothOpen-source CUDA, Triton and HIP compiler targeting multiple GPU and CPU architectures.项目地址https://gitcode.com/gh_mirrors/bar/Booth点击查看免费下载相关推荐EdgeTranslate通信机制揭秘Channel类如何协调前后端数据交互EdgeTranslate通信机制揭秘Channel类如何协调前后端数据交互 EdgeTranslate作为一款优秀的浏览器翻译扩展其强大的通信机制是确保用前端TileLang 三层编程接口与编译流程解析Tile 化编程模型如何落地为多后端 GPU KernelTileLang 三层编程接口与编译流程解析Tile 化编程模型如何落地为多后端 GPU Kernel 本文围绕 TileLang 官方的入门总览文档 doc编译器编程语言高性能计算人工智能深度学习揭秘tiny-gpu如何通过数据压缩技术优化GPU内存带宽揭秘tiny gpu如何通过数据压缩技术优化GPU内存带宽 在当今GPU性能瓶颈中内存带宽优化已成为提升计算效率的关键所在。 tiny gpu 作为一个极简硬件开发图形学教育创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考