使用riscv64-unknown-elf(newlib)交叉编译TensorFlow Lite适配RISC-V模拟器
riscv64-unknown-elf(newlib)环境编译TensorFlow Lite 适配结论
仅调整Makefile配置无法完成完整适配
- 官方原生RISC-V构建配置的适配范围明确覆盖两类场景:基于glibc的
riscv64-unknown-linux用户态构建、基于newlib的riscv32-unknown-elf裸机/模拟器构建 - 直接将现有32位elf配置修改为64位参数后执行
make出现的报错,并非单纯调整编译器路径、参数前缀就能解决,核心卡点集中在三个层面:- 链接阶段依赖缺失:现有32位elf配置默认链接的libgloss、newlib系统调用桩没有匹配64位编译的入口,会报
_start、write、fstat等核心符号未定义的错误 - 编译阶段静态断言失败:配置中针对riscv32设置的栈对齐阈值、内存分配块大小约束,在64位newlib环境下会触发TensorFlow Lite内存分配器的编译期校验失败
- 运行时环境不兼容:直接复用Linux构建分支配置编译出的二进制,因为依赖glibc的动态内存、线程实现,在Spike这类无Linux内核的模拟环境上启动会直接触发指令异常
- 链接阶段依赖缺失:现有32位elf配置默认链接的libgloss、newlib系统调用桩没有匹配64位编译的入口,会报
2019年CARRV论文的可复现适配逻辑
- 该论文提到的需要修改TFLite源码的核心改动没有特殊黑箱逻辑,三类改造即可实现目标:
- 替换系统调用抽象层:移除对glibc特有接口的依赖,将文件操作、标准输出逻辑替换为newlib兼容的semihosting桩实现,去掉对pthread库的强依赖,将多线程算子调整为单线程串行执行模式
- 静态化内存管理:针对Spike无动态堆扩展能力的特性,将TFLite默认的动态内存分配逻辑替换为固定大小的静态内存池,在编译期固化所有张量的内存占用,完全取消运行时动态
malloc调用 - 匹配裸机链接规则:替换默认的Linux链接脚本为适配64位RISC-V裸机环境的规则,将所有目标文件、newlib库、semihosting实现全部静态打包,生成无外部动态依赖的单elf文件
- 社区已将上述改造逻辑做了公开落地,可直接复用TensorFlow Lite Micro对newlib裸机环境的原生支持框架,裁剪掉原移动版TFLite的glibc依赖层,补上64位RISC-V的编译目标参数,即可在Spike模拟器上完成全流程编译与运行,无需从零修改核心算子代码
常见适配误区:不少开发者认为只要修改编译器三元组前缀就能在newlib环境下跑通TFLite,实际上只要运行目标是无Linux内核的Spike等模拟器环境,就必须走裸机newlib构建路径,和glibc版本的Linux构建属于完全分离的两套依赖体系,无法靠参数调整直接复用。
内容的提问来源于stack exchange,提问作者Yano KX
相关产品推荐
相关产品推荐

