FC2カウンター FPGAの部屋 2018年03月01日

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

AXI4-Stream インターフェースの全結合層2(C コードや指示子による性能差2)

AXI4-Stream インターフェースの全結合層1(C コードや指示子による性能差1)”の続き。

前回は、AXI4-Stream インターフェースの全結合層の最初のC ソースコードを合成したときの実力を見てきた。今回は、更に指示子を入れて行くと、どの様に性能が変化するかを見ていきたい。

次に、Loop3 に PIPELINE 指示子を入れてみよう。II = 1 なので、このループの下はすべて展開されて、1 クロックで動作するように回路が生成されるはずだ。可能であれば。。。つまり、100 回ループする Loop4 は展開されて、100 並列の回路になるはずだ。可能であれば。。。
C コードの合成を行った。結果を示す。
affine_layer_13_180228.png

Estmated は11.00 ns でタイミング制約をオーバーしている。Latency は 7,804 クロックでDetail のLoop2_Loop3 の Initiation achieved を見ると、100 クロックになっている。これはPIPELINE指示子で 1 クロックにしたはずが 100 クロックになっている。
リソース使用量は、BRAM_18K は 2 個、DSP48E は 200 個、FF が 12,385 個、LUT に至っては、283,899 個でZYNQ-7020 のLUT 数に対するパーセンテージは 533 % と大幅にオーバーしてしまった。

なお、PIPELINE指示子を入れても、Detail のInitiation achieved が 1 にならない原因はdot[] 配列がBRAM にアサインされてしまってポートが 2 個のみだからである。この場合は、Loop4 が展開されているので、200 個のポートが必要になる。
affine_layer_14_180228.png

Analysis 画面を示す。C101 まである。
affine_layer_15_180228.png

Resource 画面を示す。
affine_layer_16_180228.png

やはり、dot[] 配列へのWrite が続いている。


次に、Detail のInitiation achieved を 1 クロックにするために、dot[] 配列を展開してみよう。ARRAY_PARTITION 指示子の complete オプションを入れる。

#pragma HLS ARRAY_PARTITION variable=dot complete dim=1


affine_layer_17_180228.png

C コードの合成を行った。結果を示す。
affine_layer_18_180228.png

Estmated は 9.40 ns で制約を満たしている。
Latency は 84 クロックで劇的に少なくなっている。Detail のLoop2_Loop3 の Initiation achieved を見ると、1 クロックになっている。目標達成だ。
リソース使用量は、BRAM_18K は 0 個、DSP48E は変わらずに 200 個、FF は 12,385 個から 10,039 個に減少した。LUT は 283,899 個から 284,571 個に増えた。

Analysis 画面を示す。C5 ステートまでだ。そして、dot_V の処理が縦に並んでいて、1 クロックで実行されていることを示している。
affine_layer_19_180228.png

Resource 画面を示す。
affine_layer_20_180228.png

今回の実装で、全結合層の処理に 84 クロックという結果が出た。つまり、100 MHz のクロックを使用すると、全結合層の処理を 840 ns で処理できるということだ。だが、LUT のリソース使用率は 534 % となり、ZYBO Z7-20よりもかなり大きなFPGA を使用する必要がある。次は、もっと現実的な解を求めていこう。
  1. 2018年03月01日 04:28 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0