FC2カウンター FPGAの部屋 2018年03月03日
FC2ブログ

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

FPGAの部屋

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

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

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

前回は、ピクセルをカウントするfor ループの内部をすべて展開して 1 クロックで実行することができた。その結果として、全結合層の処理を 84 クロックで処理することができた。しかし、リソースが500 % 以上でとてもZYBO Z7-20 に入らなかった。今回は今のスキームで現実的にZYBO Z7-20 のリソースで収まる回路を考えてみよう。

Loop3 の下のPIPELINE指示子をコメントアウトして、Loop4 の下のPIPELINE指示子を生かしてみよう。
これで、3 X 26 X 100 = 7,800 クロックは必要になる。
affine_layer_4_180228.png

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

Estmated は 17.22 ns でタイミング制約をオーバーしてしまった。
合成の時にワーニングが出ている。

INFO: [SCHED 204-61] Pipelining result : Target II = 1, Final II = 1, Depth = 3.
WARNING: [SCHED 204-21] Estimated clock period (17.2156ns) exceeds the target (target clock period: 10ns, clock uncertainty: 1.25ns, effective delay budget: 8.75ns).
WARNING: [SCHED 204-21] The critical path consists of the following:
    'load' operation ('dot_99_V_load_1') on local variable 'dot[99].V' (0 ns)
    multiplexor before 'phi' operation ('dot_41_V_3') with incoming values : ('dot_99_V_145_load') (1.77 ns)
    'phi' operation ('dot_41_V_3') with incoming values : ('dot_99_V_145_load') (0 ns)
    'mux' operation ('__Val2__', affine_layer1/affine_layer1.cpp:38) (4.1 ns)
    'add' operation ('__Val2__', affine_layer1/affine_layer1.cpp:43) (3.02 ns)
    'add' operation ('__Val2__', affine_layer1/affine_layer1.cpp:44) (3.02 ns)
    'add' operation ('p_Val2_8', affine_layer1/affine_layer1.cpp:47) (2.17 ns)
    'select' operation ('dot[0].V', affine_layer1/affine_layer1.cpp:48) (1.37 ns)
    multiplexor before 'phi' operation ('dot_99_V_5', affine_layer1/affine_layer1.cpp:48) with incoming values : ('dot_99_V_1_load') ('dot[0].V', affine_layer1/affine_layer1.cpp:44) ('dot_0_V_3_cast', affine_layer1/affine_layer1.cpp:48) (1.77 ns)
I


if 文でたくさん処理を書いているのがまずい気がする。特に最後のバイアスとReLU を入れているところが良くないのではないだろうか?
Latency は 8,349 クロックとなった。100 MHz のクロックを使用すると、83.49 us となる。
リソース使用量はBRAM_18K が 1 個、DSP48E は2 個、FF が 7,251 個、LUT が 12,816 個になった。

この回路構成だと、af1_weight[][] は 2 ポートしか使用しないため、ARRAY_PARTITION指示子の complete オプションは必要ないはずだ。よって、これをコメントアウトしてみよう。
affine_layer_25_180303.png

これで、C コードの合成を行った。結果を示す。
affine_layer_26_180303.png

Estmated は相変わらず 17.22 ns nのままだが、Latency は 8,346 クロックとわずかだが、少なくなった。af1_weight[][] は 2 ポートで十分という結論になった。
リソース使用量はBRAM_18K が 11 で af1_weight の分が増えたが、FF は 6,088 個、LUT は 10,286 個に減少した。

まだ、FF や LUT が多いので、ポートは足りないと思うが、dot[] のARRAY_PARTITION指示子の complete オプションも外してみよう。
affine_layer_27_180303.png

これでC コードの合成を行った。結果を示す。
affine_layer_28_180303.png

Estmated は 9.92 ns でタイミング制約を満たした。
Latency は 16,199 クロックで、100 MHz のクロックを使用すると、161.99 us となる。
Detail のLoop4 のInitiation achieved は 2 クロックでやはり、dot[] のポート数が足りないのが分かる。
リソース使用量を見ると、BRAM_18K が 13 と 2 個増えて、DSP48E は変わらずに 2 個、FF が 4,243 個に減少して、LUT が 1,491 個に激減した。

これでも良いかもしれないが、もう少しあがいてみようと思う。
  1. 2018年03月03日 07:52 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0