邓心一 7 years ago
parent
commit
da517612ab
1 changed files with 15 additions and 9 deletions
  1. 15 9
      report.md

+ 15 - 9
report.md

@@ -1,21 +1,27 @@
 
 # 第三章
 
-(略)
-
-## HLS设计
+## 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端处理。
-FNN网络的计算主要有两种:矩阵的相乘、每层网络输出向量的激活函数处理。由于矩阵相乘天然的并行性,可以利用网络的特点将其拆分为并行的计算。
+为了利用FPGA并行计算的优势,综合资源消耗和网络结构的考虑,将一个工作组分为128×128×1的工作项,最多可以并行执行16384个计算任务。核函数的网络参数、中间变量、输入输出等变量都是全局变量,可以被每一个工作项访问,IP核执行时,中间变量、输入输出的内存空间全部由PS端动态分配,利用AXI总线传递数据,网络参数保存在PS端程序中,输入数据则由PS端从SD卡读取后传递给PL端处理。
+
+PL端FNN网络的计算任务主要有三种:矩阵的相乘,每层输出的特征向量与偏置向量的加和,加和后输出向量的激活函数处理。由于矩阵相乘和向量计算天然的并行性,可以利用网络的特点将其拆分为并行的计算,分配到各个工作项上运行,以提升运算的速度。
+
+首先是矩阵相乘中,乘法的并行化。矩阵相乘可以分解为对应行列向量的对位相乘,对于一次行列向量的对位相乘而言,其中的每次乘法都可以并行执行。因此,每层网络中行列向量的乘法计算将平均分配到各个工作项上进行。第一层网络中,每次行列向量的对位相乘有16384次乘法运算,这些运算被分配到所有的工作项上同时执行,并输出到一个16384维的向量中。后四层则只需要128个工作项来并行执行向量的对位相乘,输出的结果保存在128维的向量中。
 
-首先是乘法的并行化。矩阵相乘可以分解为对应行列向量相乘,其中每一次乘法都可以并行执行。因此,每层网络中行列向量的乘法计算均平均分配到各个工作项上进行。
+其次是矩阵相乘中,中间结果求和的并行化。为了在读写内存时不因为时序产生冲突,行列向量对位相乘的结果是保存在一个较长的向量中的。为了加快求和的速度,将加法并行执行,可以以向量中点下标为界,距离为向量长度的一半的数字对应相加。这样就能同时进行多次加法运算
 
-其次是加法的并行化。向量乘法的结果保存在16384维(第一层)或128维的向量中。为了将加法并行执行,将乘法的输出以数组中点下标为界,对应位置的数字相应相加,即可同时进行多次加法运算。
+最后是向量加法和激活函数的并行计算。计算时将为每一层网络输出的向量分配其长度对应数目的工作项,每个工作项将对应位置的数字与偏置求和,并用激活函数处理。
+
+将FNN的运算并行化,能够充分发挥FPGA并行计算的优势,相对于PS端的串行计算,可以起到一定的加速效果,程度取决于同时运行的工作项的数目。同时,每次并行计算之后,需要等待所有工作项完成任务,将时序对齐。所以实际的加速效果和理论效果可能存在一定的差距。
 
 ## 网络参数配置
 
-## SDK设计
+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端即输出计算结果、读入新的图像数据并重新开始计算,直到所有的图像数据处理完毕。详细的工作流程如图所示。
 
-SDK部分负责处理数据的输入输出,以及最后结果的验证。