report.md 4.7 KB



第三章

FNN模块设计

HLS支持OpenCL1.0标准,可以用其将OpenCL C实现的kernel函数综合为VHDL语言描述的IP核。FNN网络即实现于一个OpenCL的核函数中,利用AXI总线与PS端进行数据交换。OpenCL的并发执行采用的是层级模型,当需要执行内核时,首先要指定三个维度上工作组(work-group)的数量,然后每个工作组又在三个维度上划分为不同的工作项(work-item)。一个工作项就是OpenCL并发执行任务的最小粒度。由于Zynq7000实际不支持OpenCL host端的编程,只是利用了HLS将OpenCL C写成的kernel综合出的IP核,所以实际的程序中,无法为工作项或工作组灵活地分配内核,实际上所有的工作项执行的是同一个内核。

为了利用FPGA并行计算的优势,综合资源消耗和网络结构的考虑,将一个工作组分为128×128×1的工作项,最多可以并行执行16384个计算任务。核函数的网络参数、中间变量、输入输出等变量都是全局变量,可以被每一个工作项访问,IP核执行时,中间变量、输入输出的内存空间全部由PS端动态分配,利用AXI总线传递数据,网络参数保存在PS端程序中,输入数据则由PS端从SD卡读取后传递给PL端处理。

PL端FNN网络的计算任务主要有三种:矩阵的相乘,每层输出的特征向量与偏置向量的加和,加和后输出向量的激活函数处理。由于矩阵相乘和向量计算天然的并行性,可以利用网络的特点将其拆分为并行的计算,分配到各个工作项上运行,以提升运算的速度。

首先是矩阵相乘中,乘法的并行化。矩阵相乘可以分解为对应行列向量的对位相乘,对于一次行列向量的对位相乘而言,其中的每次乘法都可以并行执行。因此,每层网络中行列向量的乘法计算将平均分配到各个工作项上进行。第一层网络中,每次行列向量的对位相乘有16384次乘法运算,这些运算被分配到所有的工作项上同时执行,并输出到一个16384维的向量中。后四层则只需要128个工作项来并行执行向量的对位相乘,输出的结果保存在128维的向量中。

其次是矩阵相乘中,中间结果求和的并行化。为了在读写内存时不因为时序产生冲突,行列向量对位相乘的结果是保存在一个较长的向量中的。为了加快求和的速度,将加法并行执行,可以以向量中点下标为界,距离为向量长度的一半的数字对应相加。这样就能同时进行多次加法运算。

最后是向量加法和激活函数的并行计算。计算时将为每一层网络输出的向量分配其长度对应数目的工作项,每个工作项将对应位置的数字与偏置求和,并用激活函数处理。

将FNN的运算并行化,能够充分发挥FPGA并行计算的优势,相对于PS端的串行计算,可以起到一定的加速效果,程度取决于同时运行的工作项的数目。同时,每次并行计算之后,需要等待所有工作项完成任务,将时序对齐。所以实际的加速效果和理论效果可能存在一定的差距。

网络参数配置

FNN网络包括5个权值矩阵,5个偏置向量,共计2147074个参数。网络参数通过C++程序,从训练完毕的神经网络中导出,以头文件的形式在编译SDK程序时烧写到ARM芯片中,再由PS端程序在运行时写入为FNN模块动态分配的内存空间里。

SDK程序设计

SDK部分负责处理数据的输入输出。待分类的图像,经过C++程序的预处理过后,存储在SD卡中,通过SDK的xilffs库读入PS端,再由PS端写入为FNN模块动态分配的内存空间里。数据和权值读入完毕后,PS端使能AXI总线控制信号的start位,FNN模块开始工作并读入数据;之后PS端等待控制信号done位变为高电平,若FNN模块完成数据处理,PS端即输出计算结果、读入新的图像数据并重新开始计算,直到所有的图像数据处理完毕。详细的工作流程如图所示。

AXI总线连接模块

AXI(Advanced eXtensible Interface)是ARM公司提出的一种高性能、高带宽、低延迟的片内总线,由五个通道组成,分别是读地址和控制通道、读数据通道、写地址和控制通道、写数据通道和写响应通道。AXI总线的一大特点就是控制通道和数据通道分离,这样可以实现先发地址、再传输数据,Master访问Slave时,可以不等待操作完成就发出下一个操作,使Slave实现对控制流的流水线处理,提升整体的处理速度。AXI总线还支持乱序访问,可以对不同的Slave进行连续操作。