尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何将prometeo程序部署到嵌入式设备:从生成C代码到交叉编译的完整流程

如何将prometeo程序部署到嵌入式设备:从生成C代码到交叉编译的完整流程 如何将prometeo程序部署到嵌入式设备从生成C代码到交叉编译的完整流程【免费下载链接】prometeoAn experimental Python-to-C transpiler and domain specific language for embedded high-performance computing项目地址: https://gitcode.com/gh_mirrors/pr/prometeoprometeo 是一个实验性的Python 转 C 代码Python-to-C transpiler领域特定语言DSL专为嵌入式高性能计算embedded high-performance computing设计。本教程将带你走完 prometeo 嵌入式部署的完整流程从编写 Python 程序、生成自包含 C 代码到交叉编译并运行在嵌入式设备上全程可操作、可复现。prometeo 是什么为什么适合嵌入式开发prometeo 允许你用 Python 语法编写科学计算程序再通过其转译器transpiler生成高性能、自包含的 C 代码。与 Numba、Nuitka、Cython 等方案不同prometeo 生成的代码不依赖 Python 运行时库libpython这正是它能部署到嵌入式设备的关键✅自包含可嵌入生成纯 C 代码仅链接 BLASFEO 高性能线性代数库✅静态类型借助 Python 原生类型注解type hints强制静态类型✅确定性内存通过静态分析保证程序最大堆内存heap usage可预测✅无垃圾回收开销避免动态内存分配执行更快更安全上图展示了 prometeo 的典型使用方式用pmt命令既可以解释执行 Python 程序也可以生成 C 代码并编译运行。部署前的环境准备安装 prometeo 与工具链1. 安装 prometeo最简单方式prometeo 已发布到 PyPI要求 Python 3.6 及以上pip install prometeo-dsl2. 源码安装方式如果需要从源码构建 C 后端生成代码时会用到可以先克隆仓库git clone https://gitcode.com/gh_mirrors/pr/prometeo cd prometeo git submodule update --init # 拉取 BLASFEO 等子模块 make install_shared # 在 prometeo/cpmt 目录下编译共享库 pip install -e . # 安装 Python 包make install_shared会编译并安装 C 运行时默认安装路径为prometeo_root/prometeo/cpmt/install。3. 准备交叉编译工具链嵌入式设备通常不是 x86 架构需要交叉编译器。以 ARM 32 位设备为例sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf第一步编写符合 prometeo 规范的 Python 程序prometeo 是嵌入在 Python 中的 DSL程序必须遵循特定规范使用类型注解、维度用dims声明、矩阵用pmat。看一个最简单的示例源码见 examples/helloworld/helloworld.pyfrom prometeo import * def main() - int: print(\nhello world!\n) return 0更贴近真实场景的线性代数示例见 examples/simple_example/simple_example.py其中用pmat创建矩阵并调用 BLASFEO 加速的矩阵乘法。第二步生成 C 代码——pmt 命令的两步式工作流先解释执行验证逻辑pmt helloworld.py --cgenFalse这个命令会用 Python 解释器直接运行程序方便快速验证算法正确性。再生成 C 代码并编译运行pmt helloworld.py --cgenTrue--cgenTrue触发完整的转译流水线核心实现在 prometeo/cmdline/pmt.py解析 AST解析 Python 抽象语法树生成 C 代码输出.c和.h文件到__pmt_cache__/目录堆内存分析用 Bellman-Ford 算法在调用图上计算最坏情况堆内存使用量生成 Makefile自动填入堆大小参数编译并运行执行后__pmt_cache__/目录下会得到三个关键产物helloworld.c、helloworld.h、Makefile——这就是要移植到嵌入式设备的核心文件。第三步理解生成的 C 代码结构生成的 C 代码结构清晰完整示例见 README.md 的 simple example 部分堆初始化按 8 字节/64 字节对齐预分配两块堆内存避免运行时动态分配数据结构struct pmat *对应 Python 端的pmat矩阵运算调用矩阵乘法A * B被映射为 BLASFEO 的c_pmt_gemm_nn(A, B, C, C)运行时库依赖prometeo.h其底层实现位于 prometeo/cpmt/如pmat_blasfeo_wrapper.c、pvec_blasfeo_wrapper.c、pmt_aux.c由于生成的代码只依赖 C 运行时和 BLASFEO天然适合交叉编译。第四步交叉编译到嵌入式目标平台方法一修改生成的 Makefile推荐__pmt_cache__/Makefile默认使用CC gcc只需替换为交叉编译器CC arm-linux-gnueabihf-gcc CFLAGS -fPIC -stdc99 CFLAGS -I$(INSTALL_DIR)/include/blasfeo -I$(INSTALL_DIR)/include/prometeo LIBPATH -L$(INSTALL_DIR)/lib/blasfeo -L$(INSTALL_DIR)/lib/prometeo然后重新编译cd __pmt_cache__ make clean make all⚠️ 注意BLASFEO 和 prometeo 的 C 运行时libcpmt.so、libblasfeo.so也需要用交叉编译器重新构建否则会出现架构不匹配的链接错误。构建入口在 prometeo/cpmt/Makefile修改其中的CC后执行make install_shared即可。方法二手动编译链接也可以手动执行交叉编译命令arm-linux-gnueabihf-gcc -stdc99 -fPIC \ -Iinstall/include/blasfeo -Iinstall/include/prometeo \ helloworld.c -Linstall/lib/blasfeo -Linstall/lib/prometeo \ -lcpmt -lblasfeo -lm -o helloworld第五步移植到设备并运行验证将交叉编译产物拷贝到嵌入式设备scp helloworld root设备IP:/usr/local/bin/ scp libcpmt.so libblasfeo.so root设备IP:/usr/local/lib/在设备上设置动态库路径并运行export LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH ./helloworld对于存储受限的嵌入式设备更推荐静态链接以摆脱动态库依赖让二进制完全自包含。性能验证转译后的 C 代码有多快prometeo 生成代码的性能可以媲美手写的高性能 C 代码。下图是 Riccati 分解基准测试源码见 examples/riccati_example/riccati_mass_spring.py的 CPU 时间对比可以看出 prometeo 生成的代码在同类工具NumPy、Julia中性能领先且生成的 C 代码比 NumPy/Julia 方案更易于嵌入非常适合 MCU、工控板等资源受限场景。部署常见问题与避坑指南问题解决方案交叉编译时链接报错确认 BLASFEO 与 cpmt 运行时也用交叉编译器重建堆内存不足查看pmt输出的最坏堆用量在 Makefile 中调大HEAP64_SIZE/HEAP8_SIZE递归或含内存分配的循环prometeo 静态分析会拒绝此类结构需改写为迭代形式设备上找不到共享库使用静态链接或正确设置LD_LIBRARY_PATH总结把 prometeo 程序部署到嵌入式设备只需五步编写类型化 Python →pmt --cgenTrue生成 C 代码 → 理解堆管理结构 → 交叉编译替换 CC 与运行时→ 移植运行。凭借自包含的 C 代码、确定性的内存使用和接近手写 C 的性能prometeo 是嵌入式高性能计算领域值得一试的 Python 转 C 方案。官方文档详见 docs/source/index.rst安装说明见 docs/source/installation/installation.rst更多示例可在 examples/ 目录中探索。【免费下载链接】prometeoAn experimental Python-to-C transpiler and domain specific language for embedded high-performance computing项目地址: https://gitcode.com/gh_mirrors/pr/prometeo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表