基于FPGA的卷积网络加速(1)

 

vivado hls是用高级语言设计硬件电路的IDE,vivado sdsoc则用于软硬件协同也就是arm传数据到FPGA,FPGA把结果传回到FPGA,开发人员不需要知道繁琐的接口的写法,只需要指定硬件函数和调用就可以。

卷积神经网络加速,最基础的也很重要的一部分就是卷积层加速了,调好一个卷积层函数或者写成模板函数,多个串联起来,就可以在硬件上实现一个卷积神经网络了。所以,这里想总结一下最基本也是很重要的一部分,卷积层并行计算的代码的写法。

下图是一个卷积层比较常规的写法(伪代码),输入图像特征图input_fm[N][Tr+K][Tc+K],权重weights[M][N][K][K],输出特征图output_fm[M][Tr][Tc],N是输入通道,M是输出通道,Tr和Tc是输出行和列。也就是一行一行地计算output_fm的像素点。

                                      

卷积层计算中三个数组和它们下表的数据依赖性对应关系如下图所示,比如input_fm的(地址)和trr与i同时相关(其他索引固定的情况下)有依赖关系dependent。但是对于tii(其他索引固定)只有一个对应的input_fm(地址),因此independent。而too的取值和input_fm(地址)没有关系,所以是irrelevent。

                   

为什么要在乎这些呢?主要是因为并行计算要求数据也要并行,比如上面想并行做K*K个乘法,就需要能够并行地从内存中读取9个权重和9个输入,权重倒是还好说比较容易分割,但是对于输入来说分割就比较困难了,(不太容易分割数组ARRAY_PARTITION )很容易造成混乱。所以需要调整卷积层计算的循环:

                

调整之后的for循环计算卷积伪代码如上图所示,即并行做Tn*Tm个乘加运算,对于Tn来说和weight和input_fm数据依赖性是independent即一个ti只对应一个地址(其他索引固定),同样的,对Tm来说和weight与output_fm数据依赖性是independent。Tm和Tn分别对input_fm和output_fm是irrelevant的。

所以最里层的两个循环并行计算,就可以很容易找到对应的数据并行访问需求,再通过ARRAY_PARTITION指令,就能够实现卷积并行计算(data parallel)。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值