2026/9/18 18:36:43

WAMR workloads 样例集构建指南:从 emsdk/binaryen 依赖安装到 iwasm 运行

WAMR workloads 样例集构建指南:从 emsdk/binaryen 依赖安装到 iwasm 运行 WAMR workloads 样例集构建指南从 emsdk/binaryen 依赖安装到 iwasm 运行【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit导读本文围绕 WAMRWebAssembly Micro Runtime仓库中的 samples/workload 目录 展开系统讲解如何为 bwa、meshoptimizer、wasm-av1、tensorflow、XNNPACK 等真实计算型 workload 搭建 WebAssembly 交叉编译环境并将产物转换为 AOT 文件后用 iwasm 运行。读完本文你将掌握 emsdk 与 binaryen 的完整安装流程、preparation.sh 一键脚本的底层逻辑、两种 WASM 工具链wasi-sdk 与 EMSDK的选型差异以及 WAMR 冒烟测试smoke test的自动化运行方式。workloads 目录能做什么WAMR 的samples/workload目录存放了一批面向真实计算场景的 WebAssembly 工作负载用于验证 WAMR 在 SIMD、AOT、多线程等能力下的运行表现。当前仓库中收录的 workload 包括目录来源项目用途说明文档bwalh3/bwaDNA 序列比对生物信息学bwa/README.mdmeshoptimizerzeux/meshoptimizer网格压缩 codecbench 基准meshoptimizer/README.mdwasm-av1GoogleChromeLabs/wasm-av1AV1 视频解码wasm-av1/README.mdtensorflowTensorFlowtf-lite 模型推理基准tensorflow/README.mdXNNPACKgoogle/XNNPACK神经网络算子基准XNNPACK/README.md本文不逐一展开每个 workload 的算法细节重点聚焦于workload 总览 README 所定义的公共依赖安装与通用编译/运行流程并佐以各子目录 README 与 CMake 脚本中的实现细节。公共依赖emsdk 与 binaryenworkload/README.md 开篇即指出所有 workload 都有一致的软件依赖要求主要包括 emsdk 和 binaryen。emsdkEmscripten SDK用于将 C/C 源码交叉编译为 WebAssemblyLLVM 后端 Emscripten 运行时支持binaryenWebAssembly 二进制工具链核心工具是wasm-opt用于对生成的 wasm 进行优化与后处理。文档同时给出两个前提说明不同操作系统尤其是 macOS 以及其他非 Ubuntu 的 Linux 发行版在安装细节上可能有细微差异本文档以Ubuntu 20.04作为示例环境。方式一preparation.sh 一键安装推荐直接使用仓库提供的 preparation.sh 安装全部依赖再编译任意 workload。该脚本是当前目录下唯一直接挂载在总览 README 中的自动化工具。从脚本源码preparation.sh可以看到它实际安装了五类软件比 README 列出的两项更多组件脚本内版本变量安装方式wabtWABT_VER1.0.31下载wabt-1.0.31-ubuntu.tar.gz解压到/opt/wabt用于 wasm 文本/二进制格式转换与校验CMakeCMAKE_VER3.25.1运行官方自解压安装脚本到/opt/cmake并软链到/usr/local/bin/cmakeemsdk3.1.28git clone 官方 emsdk 仓库到/opt/emsdkinstallactivate3.1.28binaryenBINARYEN_VERversion_111下载binaryen-version_111-x86_64-linux.tar.gz解压到/opt软链/opt/binaryenbazelBAZEL_VER6.0.0运行 bazel 官方 Linux 安装器主要服务于 tensorflow workload脚本还内置了调试模式当环境变量中存在DEBUG时执行set -xevu并以传入参数运行指定函数便于逐步骤排查安装问题见脚本末尾的DEBUG set -xevu与主流程逻辑。方式二vscode DevContainer若不想手动装依赖可以使用仓库中的vscode DevContainer.devcontainer目录快速拉起一个预配置好的开发容器容器内已包含编译 workload 所需的工具链。此方式适合希望跳过环境折腾、直接进入构建环节的场景。手动安装 emsdkREADME 原始步骤如果希望手动复现 README 中的步骤可按如下顺序执行$ cd /opt $ git clone https://github.com/emscripten-core/emsdk.git $ cd emsdk $ git pull $ ./emsdk install 3.0.0 $ ./emsdk activate 3.0.0 $ echo source /opt/emsdk/emsdk_env.sh ${HOME}/.bashrc要点README 原文强调安装后必须激活 emsdk 并设置环境变量否则编译时找不到 emcc/em用echo ${EMSDK}验证是否激活成功若输出为空则说明环境变量未生效请务必安装并激活3.0.0版本README 的版本基准。注意版本差异总览 README 以 emsdk 3.0.0 为例而仓库实际提供的 preparation.sh 安装的是 3.1.28。以脚本自动安装为准即可手动安装时建议以你所用 workload 子目录 README 的要求为准例如 tensorflow 样例内部使用 2.0.26见下文。手动安装 binaryen$ wget https://github.com/WebAssembly/binaryen/releases/download/${BINARYEN_VER}/${BINARYEN_FILE} $ tar zxf ${BINARYEN_FILE} -C /opt $ ln -sf /opt/binaryen-${BINARYEN_VER} /opt/binaryenREADME 推荐的版本为version_111即BINARYEN_VERversion_111BINARYEN_FILEbinaryen-version_111-x86_64-linux.tar.gz安装到/opt/binaryen后CMake 的查找模块 cmake/FindBinaryen.cmake 会通过 glob 匹配/opt/binaryen*来定位安装目录校验bin/wasm-opt是否存在并用wasm-opt --version解析出版本号供 CMake 判断。也就是说安装路径放在/opt下、保持binaryen-*命名模式是构建系统能够自动发现依赖的前提。构建 iwasm 与 wamrc运行前的基础设施在运行任何 workload 之前还需要先构建两个 WAMR 关键组件iwasmWAMR 在 Linux 上的独立可执行运行时wamrcWAMR 的 AOT 编译器用于把.wasm编译成本地机器码.aot文件。顶层构建脚本 samples/workload/CMakeLists.txt 通过ExternalProject_Add自动完成这两者的构建iwasm的 SOURCE_DIR 指向 product-mini/platforms/linux并以-DWAMR_BUILD_LIBC_EMCC1开启 emcc libc 支持wamrc的 SOURCE_DIR 指向 wamr-compiler其中main.c是 AOT 编译器的入口。因此最省事的做法是直接$ cd lib/wasm-micro-runtime-WAMR-2.4.1/samples/workload $ mkdir build cd build $ cmake .. $ make该命令会依次拉取并编译 bwa、meshoptimizer、wasm-av1 三个 workload → 构建 iwasm 与 wamrc → 通过自定义目标bwa_to_aot、codecbench_to_aot、av1_to_aot将各 wasm 转成.aot文件。如果需要手动单独构建可参考各子目录 README 的通用步骤# 构建 iwasm开启 SIMD $ cd wamr dir/product-mini/platforms/linux/ $ mkdir build cd build $ cmake .. $ make从 platforms/linux/CMakeLists.txt 可以看出在 64 位 x86 平台上WAMR_BUILD_SIMD默认开启解释器WAMR_BUILD_INTERP与 AOTWAMR_BUILD_AOT也默认启用这正与各 workload 需要 SIMD 加速的要求相匹配。而像 XNNPACK 这类依赖多线程的样例还需额外开启 emcc libc 与 pthread$ cmake .. -DWAMR_BUILD_LIBC_EMCC1 -DWAMR_BUILD_LIB_PTHREAD1两条工具链路线wasi-sdk 与 EMSDK各 workload 子目录 README 普遍提供两种编译 wasm 的方式它们各有侧重路线一wasi-sdkCMake 默认路线以 meshoptimizer/README.md 为例$ mkdir build cd build $ cmake .. $ make # 验证产物 $ ls codecbench.wasm该路线依赖wasi-sdk由查找模块 cmake/FindWASISDK.cmake 负责定位它 glob 匹配/opt/wasi-sdk-*要求找到share/wasi-sysroot并据此导出编译器bin/clang、bin/clang、sysroot 与工具链文件。以 bwa 为例其 CMakeLists.txt 明确要求find_package(WASISDK 16.0 REQUIRED)并将CMAKE_TOOLCHAIN_FILE指向 wasi-sdk 自带的wasi-sdk.cmake。构建期间还会执行 test-tools/pick-up-emscripten-headers/collect_files.py 收集 emscripten 头文件到../include用于补全 libc/musl 与 SSE 模拟头见CMAKE_C_FLAGS中的-isystem ../include/sse -isystem ../include/libc/musl。路线二EMSDK性能优先路线以 meshoptimizer 的 codecbench 为例$ git clone https://github.com/zeux/meshoptimizer.git $ cd meshoptimizer $ em tools/codecbench.cpp src/vertexcodec.cpp src/vertexfilter.cpp \ src/overdrawanalyzer.cpp src/indexgenerator.cpp src/vcacheoptimizer.cpp \ src/clusterizer.cpp src/indexcodec.cpp src/vfetchanalyzer.cpp \ src/spatialorder.cpp src/allocator.cpp src/vcacheanalyzer.cpp \ src/vfetchoptimizer.cpp src/overdrawoptimizer.cpp src/simplifier.cpp \ src/stripifier.cpp -O3 -msimd128 \ -s TOTAL_MEMORY268435456 \ -o codecbench.wasm $ ls -l codecbench.wasm子目录 README 明确说明EMSDK 是另一条将 C/C 编译到 WASM 的路线用其产出的 wasm 文件可能比 wasi-sdk 生成的性能更高。命令中的关键参数-O3启用最高级优化-msimd128启用 WebAssembly SIMD 指令集128 位向量这正是 WAMR 各 workload 验证的核心能力之一-s TOTAL_MEMORY268435456把 wasm 线性内存上限设为 256 MiB保证 codecbench 处理大规模网格数据时不因内存不足而失败。wasm-av1 样例则封装了便捷脚本./build.sh它会依次修改 emcc 以剔除 libc.a 中的部分对象 → 打补丁并用 emcc 编译 wasm-av1 → 构建开启 SIMD 与 libc-emcc 的 iwasm → 用 iwasm 运行testav1.aot。tensorflow 样例同样基于 emsdk内部激活 2.0.26并提供三种构建模式./build.sh # Linux 平台 ./build.sh --threads # Linux 平台多线程 ./build.sh --sgx # Linux-SGX 平台其中--max-secs 300表示最大训练/推理时长为 5 分钟可按需调整。运行 workloadAOT 编译 iwasm 执行wasm 文件编译完成后通常先用 wamrc 转为 AOT 文件再交给 iwasm 运行以获得接近原生的执行性能。以 bwa 为例bwa/README.md$ cd wamr dir/samples/workload/bwa/build $ wamr dir/wamr-compiler/build/wamrc -o bwa.aot bwa.wasm $ wamr dir/product-mini/platforms/linux/iwasm --dir. bwa.aot index hs38DH-extra.fabwa 样例需要样本数据从 bwa-0.7.15 的 bwakit 二进制包中可取得hs38DH.fa更全的数据可参考 UCSC hg19 bigZips 下载页。在顶层 CMake 构建中bwa-kit子项目会直接从官方源下载并校验URL_HASH SHA2560a7b11971bc7916b68e9df35a364afe77cb3000df02ffb3a6fbd1aff9be5878chs38DH-extra.fa到构建目录免去手动下载。运行bwa index时--dir.用于声明工作目录的访问权限——wasm 沙箱默认无法访问宿主文件系统必须显式授权这一点同样适用于 wasm-av1 读取.ivf样本视频$ wamr dir/wamr-compiler/build/wamrc -o testavx.aot testavx.wasm $ wamr dir/product-mini/platforms/linux/build/iwasm --dir. testavx.aot elephants_dream_480p24.ivfmeshoptimizer 的 codecbench 与 wasm-av1 的 av1 解码运行方式类似$ wamr dir/wamr-compiler/build/wamrc -o codecbench.aot codecbench.wasm $ wamr dir/product-mini/platforms/linux/build/iwasm codecbench.aotXNNPACK 样例的运行则直接使用已生成的.aot文件$ cd wamr-dir/samples/workload/XNNPACK/build $ iwasm average_pooling_bench.aot # 或其他 aot 文件冒烟测试用 CTest 一键验证顶层 samples/workload/CMakeLists.txt 在构建流程末尾通过include(CTest)注册了三个冒烟测试构建完成后可直接用ctest验证整条链路是否打通测试名命令验证目标run_bwa./iwasm --dir. ./bwa.aot index ./bwa/hs38DH-extra.fabwa 的 wasm→AOT→执行全链路run_codecbench./iwasm codecbench.aotmeshoptimizer codecbench 的 AOT 执行run_av1./iwasm --dir. testavx.aot ./wasm-av1/elephants_dream_480p24.ivfAV1 解码器读取样本视频并执行这三个测试与ALL级自定义目标bwa_to_aot、codecbench_to_aot、av1_to_aot配合实现了编译 workload → 构建 iwasm/wamrc → 转 AOT → 冒烟运行的端到端自动化。这也意味着只要cmake .. make ctest全绿就说明当前环境emsdk/binaryen/wasi-sdk与 WAMR 运行时配合正常可作为环境搭建是否成功的快速判据。小结围绕 workload/README.md 所定义的依赖要求本文完整还原了 WAMR workloads 的构建与运行闭环装依赖推荐 preparation.sh 一键安装 emsdk3.1.28、binaryenversion_111、wabt、CMake 与 bazel或使用 DevContainer手动安装时以echo ${EMSDK}验证环境激活选工具链wasi-sdk 路线走 CMake 自动构建EMSDK 路线手动em -O3 -msimd128编译产物性能可能更优构建运行时顶层 CMake 自动完成 iwasm-DWAMR_BUILD_LIBC_EMCC1与 wamrc 的构建转 AOT 并运行wamrc -o xxx.aot xxx.wasm后用iwasm --dir. xxx.aot ...执行注意通过--dir显式授权文件访问验证ctest运行run_bwa/run_codecbench/run_av1三个冒烟测试确认全链路可用。这套流程的意义在于它把生物信息学、网格压缩、视频解码、神经网络推理等重计算负载搬进 WebAssembly 沙箱并借助 WAMR 的 SIMD 与 AOT 能力逼近原生性能——这也是 WAMR 在嵌入式与边缘场景中验证自身运行时竞争力的标准做法。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考