【免费下载链接】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 编译器它支持把 GPU 内核写成普通的 OCaml 纯函数ocamlc负责类型检查kcomp工具读取.cmt文件并降低为 BIR 中间表示再进入与 CUDA、Triton 相同的编译管线最终输出到 NVIDIA、AMD、Metal、CPU 等六个后端。写错类型比如把int传给i32、把共享内存当全局内存读会在类型检查阶段直接报错——错误在运行前就被拦住了这就是类型安全的 GPU 内核。一、为什么 OCaml 能写 GPU 内核很多初学者以为内核只能用 CUDA C 写。Booth 的做法很巧妙OCaml 并不是跑在 GPU 上而是作为你写内核的语言。整个机制分三层Kernel模块内核语言的形状定义类型是抽象的i32、f32、garray、sarray在 kernel.mli 中声明。写代码时ocamlc用它做类型检查kcomp编译器读取ocamlc留下的.cmt文件类型化语法树把内核函数降低为 BIR 文本源码见 kcomp.mlBooth 主编译器kath通过--bir-in读入.bir文件走常规管线输出 PTX、GCN 或其他目标代码。OCaml 源码 ──ocamlc──▶ .cmt ──kcomp──▶ .bir ──kath──▶ PTX / GCN / Metal / RV64 / CPU ...好处一目了然类型错误在本地即时报错且报错信息精确到行列OCaml 的类型系统天然拒绝大量 C 语言里编译通过、运行时才炸的内核错误。二、内核子集哪些 OCaml 语法可用kcomp只接受一个精心挑选的内核子集任何子集之外的东西都会被拒绝并指明位置vadd_k.ml:7:15: this statement is not in the kernel subset子集包含的内容详见 kernel.mli类别内容类型i32、f32、a garray全局数组、a sarray块内共享数组几何内建thread_id、block_id、block_dim、grid_dim各含_y、_z形式运算整数四则与mod、浮点四则、按位与移位运算比较整数等浮点..等有序比较NaN 走 else 分支数学库sqrtf、fabsf、exp2f、sinf、rsqf等 12 个超越函数控制流if/else、计数式loop、barrier、原子操作几个新手容易踩的设计点字面量写法因为类型是抽象的常量要写成float 2.5或int 3且参数必须是字面量而非表达式garray与sarray是不同类型共享数组和全局数组在调用点无法互相混用从类型上杜绝了最经典的 GPU 内存错误累加器用ref普通的ref单元会变成栈槽mem2reg 优化后再提升为寄存器前端永远不会产生 phi 节点。三、5 步写出第一个 OCaml GPU 内核 第 1 步确认环境。需要 OCaml 5.x 和 dune用于类型检查内核并写出.cmt见 docs/usage.md 的 OCaml 一节。第 2 步写内核函数。内核就是一个普通的顶层函数。以经典的向量加法为例源码 vadd_k.mlopen Kernel let vadd (a : f32 garray) (b : f32 garray) (c : f32 garray) (n : i32) let i block_id () * block_dim () thread_id () in if i n then set c i (get a i . get b i)注意.是浮点加法是整数加法——OCaml 的类型系统会帮你选对那一个。第 3 步注册到构建文件。把新模块名加进 src/ocaml/dune 中的kernels库。这个库没有代码链接它它存在的唯一目的就是让ocamlc类型检查每个文件并生成.cmt。第 4 步构建并降低。cd src/ocaml opam exec -- dune build ./_build/default/kcomp.exe _build/default/.kernels.objs/byte/vadd_k.cmt -o vadd.bir第 5 步交给 Booth 主编译器。./kath --bir-in --nvidia-ptx src/ocaml/vadd.bir -o vadd.ptx到这里你的 OCaml 纯函数已经变成了可运行的 GPU 代码。想看看kcomp生成的中间结果打开 tests/ocaml/vadd_k.bir能看到带行号注释的完整 BIR 数据流。四、从入门示例学惯用法 仓库在 src/ocaml/ 下放了 9 个教学内核每个都只演示一个特性是绝佳的活文档示例演示特性scale_k.ml浮点字面量作为立即数clamp_k.ml浮点比较的if/elseNaN 安全reduce_k.mlloopref累加器tile_k.mlshared共享内存 barrieratom_k.mlatomic_add、atomic_xchg等原子操作ops_k.ml / ints_k.ml浮点与整型运算符全览rng_k.ml计数器式随机数其中共享内存的用法很典型tile_k.mlshared 256声明一个块级数组大小必须是字面量在内核构建时固定然后用sget/sset访问、barrier ()同步。设备函数用let[device]标注let[device] expf (x : f32) exp2f (x *. float 1.4426950408889634)它最多 5 个参数Booth 会将其内联以兼容没有调用约定的后端。五、当前限制清单写内核前先看⚠️根据 docs/features.md 和 docs/usage.mdOCaml 前端目前的边界是没有while循环和提前退出loop是步长为 1 的计数循环没有f64一切都是单精度没有 warp shuffle / ballot没有原子min/maxBIR 只有单一操作码NVIDIA 与 AMD 后端对其符号性理解相反尚无统一语义内核与设备函数都不能递归这并非 OCaml 本身的能力限制而是有意收窄的子集——CUDA C 也不是 CGPU 语言天然如此。六、验证与回归测试 改动内核或降低规则后可用 tests/ocaml/regen.sh 重新生成 9 个基准.bir文件再用 git diff 审阅变化。测试目录 tests/ocaml/ 中的基准模块与 src/ocaml/ 中的源码一一对应是前端行为的黄金标准。总结Booth 的 OCaml 前端用三句话就能概括Kernel模块提供类型安全的形状ocamlc免费替你检查每一行kcomp把检查过的代码变成 BIR。你不需要记住 PTX 指令不需要手写内存偏移类型错误在编译期就无处藏身。如果你想体验用函数式语言写 GPU 内核的完整流程从 vadd_k.ml 出发照着上面的 5 步走一遍10 分钟内就能跑通第一个内核。赞分享【免费下载链接】BoothOpen-source CUDA, Triton and HIP compiler targeting multiple GPU and CPU architectures.项目地址https://gitcode.com/gh_mirrors/bar/Booth点击查看免费下载相关推荐JAX Pallas:MGPU 内核编程参考指南用 Mosaic 在 GPU 上编写 TensorCore 内核JAX Pallas:MGPU 内核编程参考指南用 Mosaic 在 GPU 上编写 TensorCore 内核 本篇参考指南系统讲解 JAX 的 Palla人工智能机器学习深度学习编译器高性能计算如何在5分钟内安装和配置Evcxr Jupyter内核完整教程如何在5分钟内安装和配置Evcxr Jupyter内核完整教程 Evcxr Jupyter内核是Rust编程语言的官方Jupyter内核为数据科学和机器学习开发工具CLI3分钟搞定不用产品密钥MAS 免费激活 Windows 和 Office 完整教程3分钟搞定不用产品密钥MAS 免费激活 Windows 和 Office 完整教程 右下角未激活水印、Office 灰色提示MASMicrosoft操作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考