FAQ
1. 编译example时,出现类似 fatal error: 'tengine_c_api.h' file not found 的错误?

这是编译Tengine之后没有将相关文件复制到 core/include 的缘故,只需要在Tengine根目录下执行make install即可。


2. 编译Tengine时,出现类似 internal compiler error: Segmentation fault 的错误?
通常是因为编译时开启太多的线程,尝试用make clean清空编译结果,用较少的线程数(即make命令的 j 参数)重新编译。
3. 编译Android版本的Tengine时,出现 This file was generated by a newer(older) version of protoc which is incompatible with your Protocol Buffer headers. Please update your headers. 的错误?
protobuf版本不匹配。如果你使用了百度云盘上预编译好的 protobuf_lib ,请将你本地的protobuf版本升级(降级)到3.0.0版本,安装方式参见 如何安装 protobuf 3.0.0?;或者使用ndk重新编译 protobuf_lib
4.如果我的模型有某一部分操作只出现在Tengine的CPU或GPU支持的操作列表里怎么办?
尝试使用 异构计算
5.为什么树莓派3B开启 CONFIG_ARCH_ARM64=y 编译会报错?
虽然树莓派3B是64位的A53处理器,但由于官方的操作系统运行在aarch32模式下,所以无法正常编译和运行Tengine的64位汇编代码。
6. RK3399如何查看GPU的运行频率和占用率?
在终端执行cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/load
7. 开启TF_SERIALIZER之后编译报错 fatal error: graph.pb.h: No such file or directory
protobuf版本不够高,TF要求3.0.0以上的版本,安装方式参见 如何安装 protobuf 3.0.0?
8. tengine如何指定cpu核心?为什么设置 TENGINE_CPU_LIST=0 或者2 性能没差别?

tengine通过环境变量TENGINE_CPU_LIST 来设置cpu核心。 如果用的是RK3399, cpu的编号是: 0,1,2,3 为A53, 4,5 为A72, 这个信息可以通过命令cat /proc/cpuinfo查看。 因此,设置TENGINE_CPU_LIST, 无论设置0,2 都是单A53, 性能无差别。


设置方法:

  1. 在命令窗口直接设置
    export TENGINE_CPU_LIST=4,5 //两个A72
  2. 在代码中调用setenv设置
    int setenv(const char *envname, const char *envval, int overwrite);
    setenv最后一个参数overwrite 设置为0,表示如果环境变量已有设置,则不更新; 最后一个参数非0, 参数更新
    如:setenv("TENGINE_CPU_LIST", "4,5", 1);
  3. 在代码中调用set_cpu_list函数设置
    void set_cpu_list(const char* cpu_list_str);
    函数接收cpu序号的列表,用逗号作为分隔符,注意:set_cpu_list函数必须在init_tengine之前调用才能生效。
    如:set_cpu_list("4,5");
9. 执行程序时出现类似Failed to execute on: xxx Op: xxx报错?
检查一下makefile.config里是不是同时注释掉了CONFIG_ARCH_ARM64=yCONFIG_ARCH_BLAS=y,两者起码需要打开一个。对于armv8,建议打开ARM64,如果需要使用只能依赖openblas的OP(如LSTM和DeConv)则需要将BLAS一并打开;对于armv7、x86则只能打开BLAS。
10. 为什么相同的网络和相同的输入,CPU和GPU计算输出的特征向量不完全相同?
对于浮点运算,CPU只支持FP32,而GPU往往同时支持FP16和FP32。如果为GPU设置了FP16运算精度(export ACL_FP16=1),那么由于计算精度的不同,CPU和GPU的运算结果就有了一些差异。
如果你的疑问未解决,请添加开发者技术交流QQ群:829565581