论文地址:https://github.com/dgschwend/zynqnet/blob/master/zynqnet_report.pdf
项目地址:https://github.com/dgschwend/zynqnet
背景:该函数取自FIRMWARE中,该部分代码是运行在异构开发板上的代码,既可以使用FPGA进行加速,也可以选择只在ARM端运行。核心函数是fpga_top,这个函数可以在ARM上运行,也可以用FPGA加速。在运行该函数之前,需要将权值+数据搬运到DRAM上还有确定各个层的权值地址,输入输出地址,这部分代码和解析可以见:
Zynqnet(三) HSL_CODE解析 https://blog.csdn.net/crazyeden/article/details/85200655
本篇继续介绍fpga_top函数:
void fpga_top(layer_t layer, data_t *SHARED_DRAM, unsigned int weights_offset,
weightaddr_t num_weights, unsigned int input_offset)
以上为函数原型,从左至右参数依次分别为 某层,DRAM起始指针(固定值),weights_offset 权值的坐标(固定值,对每一层都是一样的),num_weights 当前层权值系数的个数,input_offset 输入数据的坐标(固定值,对每一层都是一样的),也包括输出,这部分为输入输出的存放区域。
调用的函数一:
MemoryController::setup(SHARED_DRAM, weights_offset, input_offset);
作用:将weights_offset和data_offset两个值赋给MemoryController命名空间下的全局变量
DRAM共分为两部分,一部分是权值,一部分输入输出。以下两个值是他们相对地址偏移:
MemoryController::dram_weights_offset
MemoryController::dram_data_offset
调用函数二:setLayerConfig(layer)
在调用四个命名空间内的这个同名函数对不同的缓存赋值,形参均为layer:
ImageCache::width_in ImageCache::height_in ImageCache::ch_in
ImageCache::line_width = ch_in * width_in
ImageCache::loads_left=line_