|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
卷积函数的FPGA实现-------WBRAM的重新实现. F9 G* ~8 p8 N; {, H+ F: S
/ t" S; z. \6 K" g& y( Z C5 ^' C
背景:实测IPcore在FPGA上运行时,错误语句集中于get_9_weights_to_buffer之中,极有可能是WBRAM尺寸的设定出现了问题。
, p- Z5 _8 b4 ]! c% W2 y# P8 J+ L8 V6 k! z) Z9 [
目的:找出WBRAM尺寸设定的问题,更改代码。
" i" D% u: H9 Y) B: y* \( m. V5 b0 m- Z7 U* o
目录4 |4 \4 b- i7 S$ ~( {
}+ T' f3 q; E3 [( s+ V0 C) {$ [, o) }" `9 R0 Y! X( d
一、zynqNet的WBRAM的实现
: A) ?# J) | A; w/ w. I. K% }1 i* v8 ]
1 O& e9 z+ W0 h0 N0 w9 J 1.1 zynqNet的WBRAM实现方法; D: @1 B8 L: i8 l
; o' K7 q/ i; [7 r4 P 1.2 BRAM 32k的尺寸
8 i; h, I7 W' a% J+ A7 e' C3 L; @/ d& U& Q, y/ N
4 w3 P- b# Q( K6 W
二、卷积IPcore的尺寸的推断4 K" j& G5 s! p2 O
; A3 Y/ E, I7 H6 {' y 2.1 已有资源; r9 T9 w- W" k+ H8 N
+ `: s' H, c7 T0 O
* Y2 C1 X _1 ^. T% j/ g: a: E% s
2.2 总的网络占用4 U2 e) X3 h; X2 O
' b$ ?' E. b3 v- W2 U& Q i6 ]$ c6 f% y8 r' s3 y. E i' z
2.3 已有BRAM的实验
# N* d* R) T1 e0 g% V
+ C1 X: h' ]" c% C( T9 k3 ~' Z1 T4 X
三、更改方法
% S: [, a7 \' O, N/ C6 b" g; B X7 ~/ A& }
l2 q7 K' p% s1 K- O# Y% j 3.1 尺寸的确定
* q: C0 @: ~& o4 `! G1 V3 l5 V* [9 h6 W; n' x" m
8 I. c* ?7 }$ c. ^
3.2 WBRAM尺寸的确定: ?3 x( Z. V( X" N
% G7 R, D- g) x* B
; F- b/ K9 F: Q: O 3.3 当前WBRAM的地址
% ^4 N5 `, Y7 Y) f- b
: Y* k7 V+ I6 Z7 b- _9 }/ y* L+ j# Z# V6 f7 r2 `- W
3.4 程序之中的更改
1 z# ?3 R J' [8 ]6 ?# ]' B" X
% h: o5 ^" p2 I2 s M9 w1 N
& V; H. ?' Y0 T9 c1 J7 A/ \ 3.5 synthesis报告及验证# k. G6 u# _& E( e! J
6 d* ?8 R8 e, `: ?2 F3 T* m. q% M# _2 p. a
( i- L) Z) a! `) u/ d* \* p* V7 w
% K+ \4 i6 g+ R8 P' g+ K7 T& D* U* S% I& b) n1 D" d- k
9 k, T- p3 z& K) _0 K/ c& v+ h# c
一、zynqNet的WBRAM的实现
. G/ o- }$ j. D' x6 t+ f9 a2 O7 r0 e \* A9 L1 |
1.1 zynqNet的WBRAM实现方法
! s. q' M" U& M& r3 ?6 _
+ o3 K( \. q" G' `% {' {4 E# twegiht_cache.cpp与hpp之中,可能7045的BRAM为BRAM 32k,而我们7035的BRAM为BRAM 18k
) V0 I; o: p% _( H3 I* J6 ^2 q0 A) `, A
其源码尺寸实现为四个维度* U, P/ s+ G. [7 y! O/ T
2 q6 N' q' P. i& R" @-------------------------------------------4 b$ ]3 C$ S8 d2 z2 r6 o
5 F9 {5 f+ o; D& i- X
data_t WeightsCache::WBRAM[N_PE][NUM_BRAMS_PER_PE][BLOCK_SIZE][9];+ l5 |+ t$ K/ }
/ x0 \2 j$ E" j# H5 Y6 n
// Depth of single BRAM36 in (1K x 32b) configuration
- L! s7 L7 U# _% o- l# Z+ ?! O% s0 \) Q/ q6 j
const int BLOCK_SIZE = 1024;
+ T$ e3 }9 C0 o/ D$ Y$ Z
9 q' ~ P" m; N2 X) b// Number of BRAM36 needed per PE- L( g0 f2 L# `& K) P$ t$ U/ d
2 t1 C5 [( j U
const int NUM_BRAMS_PER_PE =! m! r/ m4 ?1 W) q1 S& F
" h5 _" ^7 B' G5 f
(CEIL_DIV(((MAX_WEIGHTS_PER_LAYER) / 8), BLOCK_SIZE) / N_PE);
+ H, f5 G3 `: F6 I$ t* K1 q7 [; Z7 }7 g
+ y- ~' K3 ?6 d1 b: J& s! v-------------------------------------------
. b0 J$ ?: z7 U6 s" d: c1 |6 J. V) _
MAX_WEIGHTS_PER_LAYER为最大的层的weight的bit数目,除以8得到byte数目。; n+ ?6 k2 T3 z% Y4 |1 Q+ i
A( ~6 D4 O* J/ [ b
然后除以PE的个数,和block_size的个数即为NUM_BRAMS_PER_PE的个数。
7 a* W* e4 x" ?# s; `$ F, `% \
+ A, F' J, E6 O f1.2 BRAM 32k的尺寸+ B7 u' K' h2 K9 v
+ e4 c% u0 G" j5 `/ ^6 h
为32k个bit,即32*1024个bit,所以有32kb,即4kB- J% X" p' U% c7 M3 ]9 z8 g
1 H, L, F) v4 m每个浮点数为4byte,即32bit,所以每个BRAM刚好能存1024个浮点数$ v$ m# o% W' U% b" s( O- d
5 A* R0 g, N& R6 }3 d由此推算,BRAM 18k能存 512个浮点数。7 O6 e2 ` B6 T+ s0 f1 a) D# A1 M5 F
6 J1 ]+ ]4 Q6 G# J/ a8 |
即 0.5k*32bit=16kb<18kb- _/ ^8 B [$ w2 a# m1 {+ a* |$ B
8 r; o0 ]3 _: L% D
6 @; ` z) j/ |8 x4 L6 D: s
二、卷积IPcore的尺寸的推断5 \8 X5 L2 P4 b% Q# ]4 V
, V7 a3 j' _( r' s) k9 x- \" j/ x
2.1 已有资源
8 W. O& q9 s/ F4 L; ]6 u; u2 b2 y8 h6 U/ M- q; A- l
BRAM具体尺寸应该查数据手册,但是我们根据目前已有的项目情况和实验推出) f( [. ?2 W" r7 S, `& o
. I9 a4 z0 a' u6 ~% FBRAM 32k即 32kbit,能存1024个浮点数,* \( a K9 S1 T ^
5 D+ T/ Q& {. |; f) t' rBRAM 18k即18k bit,能存512个浮点数。7 G+ z' y4 j6 ^$ H7 u, c( k
) B" y4 E5 N1 c& J" |
2.2 总的网络占用: X" N# E& J0 K* c5 K
' @; a8 w ~7 Z- c7 M6 M( V- G
我们打出过MTCNN网络最大需要卷积的尺寸。/ c0 k. T" @& H1 J% z
" ?( ~ E) @+ s, h" h( A. ]) B
3*3滤波器的个数最多为16384,即Onet最后一层128*128*3*3的尺寸。128*128=16384
: @) j- I4 n l* E, Q+ z, Z+ C& }, Z: u% j; X" y
在此尺寸之下,设为8PE并行,则每个PE上需要2048个filter,BRAM 18k显然存不下。" g% s9 \$ ^: E1 O7 R8 @8 {' S
. o! B& D/ `3 l
2.3 已有BRAM的实验
/ O% |5 C% \: r- I& c H
9 r( R, \9 M* p% QOBRAM设为8个并行,每个BRAM的大小为 MAX_CO /N_PE,OBRAM的最大的输出通道设置为512,每个PE上所存的浮点数为 512/8= 64个。
; }* B6 w$ l1 @( \! }/ b
+ E* w) j. f8 r6 m4 c q下表中这样理解,为了更好的并行,每个OBRAM在PE上实现为2个BRAM 18k,每个PE上存64个浮点数,则每个BRAM上面32个浮点数,即每两个BRAM 18k在一个PE上,有64个浮点数(words),每个浮点数(word)占用32bit(4byte*8bit)
) S t2 T$ U- e$ Z1 e( y6 g2 A- H2 O% M
1 ]0 {# v! `; R; t2 Z& ?8 V. v \- {7 h% l, G: e
关于IBRAM,最初的程序之中最大为3904,现在为8704。(3904的实现,HLS用了8个BRAM来实现)每个BRAM上488个浮点数字。这里,word就被当作了字节。& K* h' Y& z0 E& @
2 t4 B* ^) L+ \* {2 i但是对于WBRAM而言,报告里面生成了64*2个WBRAM 18k.,每两个WBRAM存有了1024个浮点数。
0 S/ Z7 |+ m0 [9 O: H4 N; z
; {6 R$ N$ _: u$ J: x! N& {( V64*1024=65536个浮点数,与预想的权重浮点数 8PE*1024per_PE*9=73728相比少了。WBRAM的内存溢出。
1 q6 l9 J, _7 Z" j7 i" v5 X3 V7 D+ a( g% d/ r- c; a
三、更改方法
4 G6 W( T& z" ?% i6 @ t: M/ R
T" W& y6 Q- f9 v3.1 尺寸的确定
- B( k1 k: C# B( d( q) a) J& O/ \6 b( v3 y8 Z- V, l4 m
我们需要确定最终需要的尺寸的大小,
. r# [, B. S) j) U" F
$ |% ~4 ]; f5 J# c- E------------------------------------------- [0 [1 L& n! U+ A7 o3 [( s. j
3 a/ y- R0 f1 E4 r5 b" z4 s
. n! N2 n# ^5 {, G
2 J# R1 Q& }" d5 g
) i. v% T; F9 I: i9 a
- U8 p, }# e3 ~* n |
|