调用GPU

编译Tengine with ACL

Tengine是通过调用Arm Compute Library(ACL)进行GPU加速。

下面以编译armv8 linux环境为例,讲解如何编译ACL, 其他平台的ACL编译请参照ACL官方文档:

https://github.com/ARM-software/ComputeLibrary


 · 编译ACL:

git clone https://github.com/ARM-software/ComputeLibrary.git

 git checkout v18.05

 scons Werror=1 -j4 debug=0 asserts=1 neon=0 opencl=1 embed_kernels=1 os=linux arch=arm64-v8a


 · 编译Tengine

git clonehttps://github.com/OAID/Tengine.git

 cp makefile.config.example makefile.config


在配置文件中打开开关 CONFIG_ACL_GPU=y,并指定ACL路径:


 CONFIG_ACL_GPU=y

 ACL_ROOT=/home/firefly/ComputeLibrary #你的ACL路径


编译:

make -j4

 make install


 · 调用GPU跑网络 在源码中调用接口

int set_default_device(const char* device);:

 #include "cpu_device.h"

 set_graph_device(graph, "acl_opencl");


tests/bin/bench_sqz中已经调用这个接口,可直接执行

./build/test/bin/bench_sqz -d acl_opencl


设置GPU FP16模式

GPU支持用float16的数据格式进行推理计算, 可通过环境变量

export ACL_FP16=1


进行调用GPU fp16模式,加速GPU的推理性能。


CPU/GPU异构计算简介

Tengine的GPU/CPU异构调度的原理是:根据算子对计算图(Graph)进行切分,切分的子图(SubGraph)再通过调度器分配给相应的device。由于GPU的编程较复杂,我们优先支持神经网络中的常用算子(例如:CONV,POOL,FC等),而对于某些网络中特有的算子(例如检测网络SSD中的PRIORBOX等),我们将这些算子分配给CPU进行计算。

Tengine中算子计算调用CPU/GPU是内部自动分配的,无须用户指定。用户只需开启GPU模式配置设备acl_opencl即可。

目前Tengine中支持CPU/GPU异构计算的网络有:

  • Mobilenet-SSD
  • YOLOV2
  • YOLOV3
  • ...