【免费下载链接】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 与 CPU 架构。而在它最极客的一条后路上藏着一段极简工程一个名为软浮点运行时soft-float runtime的纯 C 组件用约 470 行代码、零内存分配为 Tenstorrent 芯片上没有 FPU 的 RV32IM 整数核完整实现了 IEEE-754 单精度fp32算术。本文拆解它的原理、关键算法与编译器集成方式。为什么GPU内核需要软浮点在大多数 GPU 上float a b由硬件浮点单元FPU一条指令完成。但 Tenstorrent Wormhole 上的 baby RISC-V 核只有RV32IM指令集——纯整数、无浮点单元。想在这样的核上跑含float的 CUDA 内核只有两条路换带 FPU 的核硬件层面不可选用整数指令模拟浮点即软浮点soft-float把 32 位浮点数的位模式当作整数用移位、加减、乘法、64 位除法重建出 IEEE-754 语义。Booth 选择了后者。文档 docs/usage.md 明确写道baby 核无 FPUfloat 必须走软浮点运行时。该运行时就落在 runtime/device/ 目录下。设计决策①采用 libgcc 命名约定公共 API 声明在 runtime/include/booth/soft_fp.h 中全部是熟悉的名字函数含义__addsf3/__subsf3浮点加 / 减__mulsf3/__divsf3浮点乘 / 除__negsf2取负__eqsf2…__gesf2、__unordsf2比较NaN 无序__floatsisf/__fixsfsi等整数 ↔ 浮点转换这些是libgcc 的标准符号名也是 RISC-V soft-float psABI 的调用约定。这意味着Booth 生成的内核代码只要像往常一样调用__addsf3任何 RV32 工具链都能接上——未来接入厂商 SFPU 或别的软浮点实现都不需要改代码。设计决策②拆包/打包 标志位分派核心内部实现在 runtime/device/soft_fp.c配套位级定义在 runtime/device/soft_fp_internal.h。一切运算的第一步都是sfp_unpacksoft_fp.c#L12-L58把 32 位模式拆成符号、非偏置指数、带隐含位的尾数并同时打上is_zero/is_inf/is_nan/is_sub标志。fp32 的位结构一览位段宽度说明符号位1bit 31偏置指数8偏置 127255 表示 Inf/NaN显式尾数23隐含前导 11.0表示为0x800000拆包时一次性把特殊值±0、±Inf、NaN、非规格数识别出来后续运算就能走标志位分派而不必每次重新解码。反向的sfp_packsoft_fp.c#L62-L86则把运算结果重新拼回 32 位模式溢出自动变 ±Inf下溢冲零。一个刻意的取舍默认开启FTZ/DAZ非规格数一律冲零——这是最快的默认路径定义SFP_STRICT_IEEE1则保留非规格数慢路径为严格 IEEE 行为留了升级开关。NaN 统一归一为规范静默 NaN0x7FC00000与 CUDA 和 x86 行为一致保证下游比较和打印可预期。核心算法sfp_round_normal 的就近偶数舍入软浮点最难的部分不是加法而是舍入。sfp_round_normal 接受一个宽尾数例如 48 位乘积按三步工作左归一循环左移直到最高 1 落在目标位带 64 次计数器防死循环损坏输入也不会卡死右归一把目标位以上的溢出血出为粘滞位sticky同时递增指数就近偶数round-to-nearest-even检查 round 位与 sticky 位若sticky 为 1或LSB 为 1则进位若 24 位尾数进位溢出则右移一位、指数加 1。这个shift_amount参数很优雅同一个函数既能舍入乘法的 48 位乘积shift 23又能舍入除法商shift 5。四则运算如何用纯整数重建加减法sfp_add_signed先处理特殊值——NaN 传播、Inf (-Inf) NaN、零的符号规则x (-x) 0然后把较小指数操作数的尾数在64 位寄存器中对齐下移被移掉的低位全部折叠进 sticky 位同号相加、异号相减精确对消直接返回 0。乘法soft_fp.c#L254-L284最便宜的运算——符号异或、指数相加减一个偏置两个 24 位尾数相乘得到 48 位乘积交给sfp_round_normal收工。Inf × 0 NaN单独拦截。除法soft_fp.c#L289-L324分子尾数左移 28 位后做 64 位整数除法余数折叠为 sticky 位——在 baby 核上这一步落到__udivdi3库调用。指数取两操作数之差。比较与转换容易被忽视的细节比较遵循 libgcc 约定NaN 下所有有序比较返回让谓词读为 false的值__unordsf2是专用 NaN 探测。0与-0按位不同但相等。同号时直接比位模式大小IEEE 编码的妙处同号双负则反向。整数 → 浮点soft_fp.c#L401-L437最高 1 的位置直接给出非偏置指数再复用乘法路径的舍入INT_MIN通过int64_t取负避开符号陷阱。浮点 → 整数向零截断NaN 返回 0Inf/溢出按 LLVM/gcc 惯例钳制到INT_MIN/INT_MAX与主机工具链行为对齐。编译器如何接入这条路径软浮点不是孤立库而是编译流水线的一环前端降浮点Booth 的 BIR IR 中float 算术会被降低为对这些__device__函数的BIR_CALL调用——soft_fp_internal.h 的注释点明了这一点host 上测试时__device__宏自动擦除同一份代码两边可跑。RV32IM 后端src/tensix/rv_isel.c 目前能正确物化浮点常量寄存器里的位就是 fp32 的位栈帧按 RISC-V soft-float psABI 做 16 字节对齐遇到BIR_FADD等浮点运算则诚实拒绝——因为运行时尚未链接进--rv-elf。当前状态如 src/main.c 中--rv-elf的帮助文本所说现阶段 baby 核走纯整数内核软浮点运行时已完成并验证接入是下一步会话的事。CHANGELOG.md 记录了它随 RV32IM 后端一起落地的经过。测试与未来走向形式化验证正确性验证是这套实现最值得称道的部分。tests/tsoft_fp.c 在host 上编译同一份运行时__device__擦除的妙用做两类比对位级精确比对28 个 IEEE 角落用例NaN、Inf、带符号零、最小规格数等逐位核对期望的十六进制模式随机对撞1000 组随机浮点对与 host FPU 的结果比对任何与真实硬件的偏差都会立刻暴露。而 docs/roadmap.md 勾勒了更远的一步约 470 行的无分配、有界循环、可完全推演大小的 C 代码恰好是Why3 / Frama-C / Coq 形式化验证的理想对象——验证成功后一个被形式化证明的软浮点就将真实运行在真实加速器上。这正是它小得能被推理的设计初衷。关键文件速查文件角色runtime/device/soft_fp.c473 行软浮点运行时本体runtime/include/booth/soft_fp.hlibgcc 命名公共 APIruntime/device/soft_fp_internal.h位级常量、拆包结构、舍入入口tests/tsoft_fp.c位级 host FPU 对撞测试src/tensix/rv_isel.cRV32IM 指令选择与 psABI 栈帧docs/roadmap.md形式化验证规划一句话总结Booth 用拆包标志分派 64 位宽尾数 就近偶数舍入三板斧把 IEEE-754 单精度完整地搬进了纯整数世界——470 行、零分配、libgcc 命名兼容为无 FPU 的 GPU 小核打开了 float 内核的大门。赞分享【免费下载链接】BoothOpen-source CUDA, Triton and HIP compiler targeting multiple GPU and CPU architectures.项目地址https://gitcode.com/gh_mirrors/bar/Booth点击查看免费下载相关推荐VexRiscv浮点单元FPU详解从IEEE 754标准到FPGA优化实现VexRiscv浮点单元FPU详解从IEEE 754标准到FPGA优化实现 VexRiscv是一款专为FPGA优化的32位RISC V处理器实现其浮点单元F硬件开发嵌入式Go 半精度浮点实战深入 x448/float16 的 IEEE 754 binary16 实现Go 半精度浮点实战深入 x448/float16 的 IEEE 754 binary16 实现 本篇文章围绕 Sliver 仓库中 vendored 的 g网络安全bloodborne_pc 中 half 半精度浮点库IEEE 754 16 位类型、舍入控制与单精度内部实现bloodborne_pc 中 half 半精度浮点库IEEE 754 16 位类型、舍入控制与单精度内部实现 本文围绕 gpu/third_party/ha创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考