ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Bend 如何编译生成 HVM、独立 C 与 CUDA 程序(gen-hvm/gen-c/gen-cu)?

Bend 如何编译生成 HVM、独立 C 与 CUDA 程序(gen-hvm/gen-c/gen-cu)? Bend 如何编译生成 HVM、独立 C 与 CUDA 程序gen-hvm/gen-c/gen-cu【免费下载链接】BendA massively parallel, high-level programming language项目地址: https://gitcode.com/GitHub_Trending/be/Bend用 Bend 开发程序时除了用bend run-c、bend run-cu这类解释器命令直接运行还有一个常见诉求把 Bend 程序编译成可以离开 Bend 环境使用的产物——要么生成 HVM 交互网络交给 HVM2 工具链进一步处理要么生成独立的 C / CUDA 源文件再用gcc/nvcc编译成原生可执行文件以获得更好性能。Bend 的gen-hvm、gen-c、gen-cu三个子命令分别对应这三条路径命令形式为bend gen-hvm file.bend # 编译到 HVM 并打印到 stdout bend gen-c file.bend # 编译到独立 C 并打印到 stdout bend gen-cu file.bend # 编译到独立 CUDA 并打印到 stdout前提是已经安装 Bend 与 HVM2 运行时下文按「安装 → 三种生成路径 → 编译选项 → 验证与限制」的顺序展开。准备条件安装 Bend 与 HVM2按 README.md 的安装说明先准备工具链。Linux# Install Rust if you havent already. curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh # For the C version of Bend, use GCC. We recommend a version up to 12.x. sudo apt install gccMac 上把sudo apt install gcc换成brew install gcc即可。如果要生成 CUDA 版本还需安装 NVIDIA CUDA toolkitLinux12.x。然后安装 HVM2 与 Bend 本体# HVM2 is HOCs massively parallel Interaction Combinator evaluator. cargo install hvm # This ensures HVM is correctly installed and accessible. hvm --version # This command will install Bend cargo install bend-lang # This ensures Bend is correctly installed and accessible. bend --version两条--version命令都应能正常输出版本号这是后续所有生成命令可用的判断依据。平台限制README 明确说明当前版本尚未支持 Windows官方建议用 WSL2GPU 目前只支持 NVIDIA 显卡。一个容易忽略的依赖即使你只想生成 C 程序也需要先装好 HVM2。从 src/main.rs 的实现可以看到gen-c/gen-cu会先把程序编译成 HVM 书book写入当前目录的.out.hvm临时文件再调用 HVM2 二进制执行hvm gen-c .out.hvm或hvm gen-cu .out.hvm生成最终代码完成后删除该临时文件。HVM 二进制的查找顺序是CLI 全局参数--hvm-bin HVM_BINHVM 命令或可执行文件路径→ 环境变量HVM_BIN→ PATH 中的hvm。如果你的hvm不在 PATH 里用--hvm-bin或HVM_BIN指定即可。路径一生成 HVM 网络gen-hvm用 README 中的并行求和例子做演示。创建parallel_sum.bend# Defines the function Sum with two parameters: start and target def Sum(start, target): if start target: return start else: # If start is not equal to target, calculate the midpoint (half), # then recursively call Sum on both halves. half (start target) / 2 left Sum(start, half) # (Start - Half) right Sum(half 1, target) return left right # A parallelizable sum of numbers from 1 to 1000000 def main(): return Sum(1, 1_000_000)生成 HVM 书bend gen-hvm parallel_sum.bend parallel_sum.hvmgen-hvm把编译后的每个顶层函数输出为一个 HVM 定义。下面是仓库测试用例的示例结果文档示例非固定预期输出对输入 tests/golden_tests/cli/compile_all.bend 执行bend gen-hvm file -Oallstdout 为Pair.get (a ((Pair.get__C1 (a b)) b)) Pair.get__C0 (a (b ((a (b c)) c))) Pair.get__C1 (?((Pair.get__C0 *) a) a) Pair/Pair (a (b ((0 (a (b c))) c))) main d Pair.get ~ (($([] $(a b)) (a b)) (c d)) Pair/Pair ~ (40 (2 c))判断生成是否成功看 stdout 是否出现函数名 ...形式的 HVM 定义且 stderr 没有诊断错误。两点与gen-hvm直接相关的行为说明gen-hvm不知道目标架构是什么因此默认不做 eta-reduction。仓库测试注释解释了原因对递归函数做 eta-reduction 可能影响 CUDA runtime 上的性能所以目标架构不是 C 时默认关闭。如需要可用-Oeta显式开启。生成的 HVM 书文本文件可以直接交给 HVM2 工具链——Bend 内部生成 C/CUDA 时正是把书写成.out.hvm后由hvm二进制消费的所以把gen-hvm输出重定向为.hvm文件后用 HVM2 命令继续处理是文档支撑的用法。HVM 节点层面各类 Bend 项如何落到 CON / DUP / NUM / OPR / MAT 等节点可参考 docs/compilation-and-readback.md。路径二生成独立 C 程序gen-cbend gen-c main.bend main.c按 GUIDE.md 的说法这条命令把.bend文件转换成一个「小的、无依赖dependency-free的 C 文件」执行同样的计算。生成的 C 文件用 GCC 编译成可执行文件GUIDE 给出的命令是gcc main.c -o main -O2 -lm -lpthread # if youre on Linux gcc main.c -o main -O2 # if youre on OSX ./main./main的输出应与解释器运行结果一致同一文件可以先跑bend run-c main.bend交叉对照run是run-c的别名默认走 C 解释器。可选分支——程序使用了 IO 动态库时按 docs/ffi.md需要加-rdynamic让动态库能引用主程序符号# Compiling for C bend gen-c my_app.bend my_app.c gcc -rdynamic -lm my_app.c -o my_app路径三生成独立 CUDA 程序gen-cu前提比 C 路径多两条NVIDIA GPUREADME 说明目前只支持 NVIDIA以及 CUDA toolkit 12.x。生成命令与 C 版本同构bend gen-cu main.bend main.cudocs/ffi.md中给出的 nvcc 编译命令同样是使用动态库的场景-rdynamic用于让动态库引用主程序符号# Compiling for Cuda bend gen-cu my_app.bend my_app.cu nvcc --compiler-options-rdynamic my_app.cu -o main不引用动态库的程序同理用nvcc编译生成的.cu文件即可文档对gen-cu的说明集中在这一编译形式上没有给出更多 nvcc 参数组合。生成时的常用编译选项三个gen-*子命令都接受同一组-O编译选项完整列表与默认值见 docs/compiler-options.md选项默认作用-Oall/-Ono-allDisabled启用/禁用全部编译器 pass-Oeta/-Ono-eta非 C 目标下强制关闭eta-reduction-Oprune/-Ono-pruneDisabled删除未使用的定义-Omerge/-Ono-mergeDisabled合并相同的顶层函数-Oinline/-Ono-inlineDisabled内联编译为无参 inet 节点的项-Ocheck-net-size/-Ono-check-net-sizeDisabled限制每个编译后函数不超过 64 个 HVM 节点-Oadt-scott/-Oadt-num-scottadt-num-scott选择 ADT 的 lambda 编码与生成场景直接相关的三个点check-net-size这是 CUDA runtime 的内存限制。若未显式指定gen-cu/run-cu等 CUDA 目标可能触发该检查超过 64 个节点的定义会报Definition is too large for hvm。文档说明如果你不跑*-cu版本可以用-Ono-check-net-size关闭它。adt-encodingIO只在-Oadt-num-scott默认值下可用。如果你的程序用了 IO不要切到-Oadt-scott。参数写错会直接报错错误信息会列出全部合法取值文档示例error: invalid value foo for -O COMP_OPTS [possible values: all, no-all, eta, no-eta, prune, no-prune, linearize-matches, linearize-matches-alt, no-linearize-matches, float-combinators, no-float-combinators, merge, no-merge, inline, no-inline, check-net-size, no-check-net-size, adt-scott, adt-num-scott, type-check, no-type-check]三个gen-*子命令还接受全局参数-e, --entrypoint NAME使用除main/Main以外的入口和-v, --verbose以及-W/-D/-A警告控制如-W missing-main。完整 pass 列表及其语义encode_adt、linearize_matches、expand_main等见 docs/compilation-and-readback.md 的「Bend compiler passes」一节。结果验证与已知限制验证方式按路径区分gen-hvm检查 stdout / 重定向文件中出现name ...的 HVM 定义stderr 无错误诊断gen-cgcc编译无报错后运行./main并与bend run-c main.bend的结果对照gen-cu在装好 CUDA toolkit 的 NVIDIA 机器上nvcc编译并运行生成的二进制。文档明确给出的限制写进预期里更稳妥README 说明代码生成器仍处于早期阶段成熟度不及 GCC、GHC 这类编译器GUIDE 指出当前编译版与解释版差距不大compiled version isnt much faster than the interpreted one官方把改进编译器列为后续重点CUDA 路径受 NVIDIA-only 和 64 节点定义大小检查两个硬约束。如果生成过程中报类型错误先用bend check file.bend单独做静态检查定位问题gen-c/gen-cu的完整链路临时.out.hvm文件、HVM 二进制的定位逻辑可回到 src/main.rs 查看实现。【免费下载链接】BendA massively parallel, high-level programming language项目地址: https://gitcode.com/GitHub_Trending/be/Bend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表