Booth OCaml内核指南:如何用纯函数在5步内写出类型安全的GPU内核
【免费下载链接】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),仅供参考

相关新闻

Flutter鸿蒙适配:MainAxisSize布局属性深度解析与实战避坑

Flutter鸿蒙适配:MainAxisSize布局属性深度解析与实战避坑

前阵子做Flutter应用的鸿蒙适配,碰到一个特别典型的布局问题:页面底部的操作按钮栏,在安卓、iOS上一直好好的,按钮靠左排列,灰色背景只包住按钮区域;结果换到鸿蒙设备上一跑,整行都被撑满了&…

2026/10/11 13:18:54 阅读更多 →
如何把NyaTerm部署成Web应用:Docker一键部署与配置完全指南

如何把NyaTerm部署成Web应用:Docker一键部署与配置完全指南

【免费下载链接】nyaterm A modern remote terminal workspace 项目地址: https://gitcode.com/gh_mirrors/ny/nyaterm 点击查看 免费下载 NyaTerm Web应用部署非常简单:通过Docker一条命令,就能把这款现代远程终端工作区运行在服务器上&…

2026/10/11 13:18:54 阅读更多 →
Dagger v0.18.3 版本解析:develop 的 --recursive、免 SDK 模块加载、Vault Secret TTL 与实验性 MCP 工具

Dagger v0.18.3 版本解析:develop 的 --recursive、免 SDK 模块加载、Vault Secret TTL 与实验性 MCP 工具

DevOpsCI/CD后端CLI云原生 【免费下载链接】dagger Automation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud 项目地址: https://gitcode.com/GitHub_Trending/da/dagger 点击查看 免费下载 Dagger v0.18.3&#…

2026/10/11 13:18:54 阅读更多 →

最新新闻

有效使用Claude Code:从问答误区到工程级实战

有效使用Claude Code:从问答误区到工程级实战

放弃思考。直接用Claude Code把这条Issue给看了”。结果它真的打开了仓库、跑了测试、改了三行代码、还顺手给我提了一个测试用例。那一刻我才意识到,不是这工具差,是我根本没把它当成一个能执行的人,而是当成一个更聪明的百度。这种理解偏差…

2026/10/11 14:09:20 阅读更多 →
医务管理系统详细设计说明书:从文档到可落地设计基线

医务管理系统详细设计说明书:从文档到可落地设计基线

简介:《医务管理系统详细设计说明书》面向医疗信息化行业的系统分析师、架构师与开发人员,用于指导医院医务管理系统的设计与落地。文档围绕系统简述、参考资料、设计约束、总体结构与功能结构设计、系统架构图、版本说明与修改记录、安全与隐私保护、性…

2026/10/11 14:09:20 阅读更多 →
PLC编程中FC与FB的本质区别:从内存模型到工程选型实战

PLC编程中FC与FB的本质区别:从内存模型到工程选型实战

1. 从一次产线停机说起:为什么“功能”和“功能块”总被混为一谈很多做工业自动化控制的朋友,在刚接触PLC编程或者DCS组态的时候,都会遇到一个绕不开的坎:功能(Function,FC)和功能块&#xff08…

2026/10/11 14:09:20 阅读更多 →
SpringBoot+Vue+MySQL实战:BS美食网站前后端分离系统全解析

SpringBoot+Vue+MySQL实战:BS美食网站前后端分离系统全解析

做课程设计或者初学前后端分离,最怕遇到的一件事,就是从网上扒下来一个写着“可直接运行”的项目,结果环境配到怀疑人生。今天聊的这套BS美食网站信息管理系统,走的是SpringBoot后端Vue前端MySQL数据库的经典组合,前后…

2026/10/11 14:09:20 阅读更多 →
为什么吃药会伤肝呢?科学家对小鼠做了什么?!

为什么吃药会伤肝呢?科学家对小鼠做了什么?!

背景介绍:药物性肝损伤(druginducedliverinjury,DILI)可分为固有型与特异质两类,是导致新药撤市、急性肝衰竭的主要诱因。布洛芬作为常用非甾体抗炎药,常规治疗剂量肝毒性较低,大剂量或长期暴露…

2026/10/11 14:09:20 阅读更多 →
QT实现FTP上传下载工具:协议选型、核心类与避坑指南

QT实现FTP上传下载工具:协议选型、核心类与避坑指南

简介:一套基于Qt5框架、使用C语言编写的FTP客户端工具源码,面向需要在桌面或嵌入式Linux平台集成文件上传与下载功能的开发者。源码包共12个文件,其中4个cpp源文件与3个h头文件组成核心逻辑,pro工程文件和ui界面文件帮助快速构建项…

2026/10/11 14:08:19 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →