在考虑神经网络加速器架构时,硬件与软件之间的接口对于加速器的易用性,甚至加速器的性能发挥尤为重要。下面介绍几种常见的软硬件编程模型,读者可以根据需求选择其中的一种或者几种。
❑ISA(Instruction Set Architecture,指令集结构):和CPU类似,硬件实现一系列的指令,软件通过指令来完成对硬件的控制和监控。需要对神经网络算子进行编码,产生一系列的指令。对于神经网络来说,一个算子包括很多信息,对应的指令一般较长,可达上百字节。此外,对于不同的算子,可能对应指令的长度不一,即使是ISA的形式,很可能也是变长指令。
❑VLIW(Very Long Instruction Word,超长指令字):目前有部分公司通过多核或众核SDP(Software Defined Perimeter,软件定义边界)来实现神经网络加速器,对于这种类型的加速器,一般采用VLIW作为其编程模型。
❑REG_CFG(Register Config,寄存器配置):加速器直接将硬件使用的寄存器暴露给软件,软件通过读写这些寄存器来实现对加速器的监控和控制。
❑在硬件内部集成“图控制器”:神经网络结构可抽象为一个图(Graph),我们可以将网络结构描述数据(比如prototxt)直接作为软硬件之间的编程接口。硬件负责加载、解析、控制、整个网络的执行。
以上4种编程模型都需要用编译器来构建软件与硬件之前的桥梁,不同的编程模型对编译器的要求也不同,这4种编程模型对编译器的要求依次降低。如今,神经网络结构变得越来越复杂,硬件加速器又可能具有层次较深的存储子系统,这大大增加了编译器的复杂度。此外,编译器的优劣对硬件性能的发掘、产品的推广都意义重大。目前来看,TensorRT、XLA(Accelerated Linear Algebra,加速线性代数)、TVM(端到端深度学习编译器)、Glow等神经网络编译器也相继出现,但还有很长的路要走。与硬件相关的优化,还有许多工作需要做,如图1-28所示是TVM的框架。
图1-28 TVM框架