FC2カウンター FPGAの部屋 (目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)
FC2ブログ

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

FPGAの部屋

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

(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る4(チューンナップ1)

(目標)Vivado HLSで1クロック毎に結果を出力できるNNを作る3(Vivado HLS)”の続き。

前回は、MNIST データセットを使った2層の全結合層を持ったニューラル・ネットワークについて、Vivado HLS でC シミュレーション、C コードの合成を行った。今回は目標の1クロック毎に結果を出力できるようにチューンナップしていこう。

今度はニューラルネットワークの回路全体を開始間隔 (II) = 1 のパイプライン実行をさせるということで、mnist_nn() 関数の下にパイプライン指示子を挿入した。

#pragma HLS PIPELINE II=1


これで合成を行ったところ、コードサイズが大きくなって、ランタイムが長くなって、メモリ使用量が過剰になる可能性があるというエラーが出てしまった。とことんやってくれれば良いのに。。。
all_deploy_afnet4mnist_18_190331.png

ERROR: [XFORM 203-504] Stop unrolling loop 'af1_dot1' (all_deploy_afnet4mnist2/mnist_nn.cpp:840) in function 'mnist_nn' because it may cause large runtime and excessive memory usage due to increase in code size. Please avoid unrolling the loop or form sub-functions for code in the loop body.
ERROR: [HLS 200-70] Pre-synthesis failed.


UG902 (v2018.3) 2018 年 12 月 20 日 高位合成 の 340 ページを見ると、ソリューションのコンフィギュレーション設定に config_compile があって、そのオプションに -ignore_long_run_time があるので、これをやってみようと思ったが、Vivado HLS のSolution Settings... のGeneral の Configuration Settings の config_compile には、 -ignore_long_run_time のオプションがない。
all_deploy_afnet4mnist_19_190331.png

そこで、Vivado HLS をTCLスクリプトから実行することにした。
参考にさせていただいたのは、msyksphinz/fpga_designs の fpga_designs/vivado_hls/edge_filter/script.tcl だった。
これを参考に ignore_long_run_time.tcl を書いた。
all_deploy_afnet4mnist_20_190331.png
ignore_long_run_time.tcl を示す。

open_project all_deploy_afnet4mnist3
set_top mnist_nn
add_files mnist_nn.cpp
open_solution solution1
create_clock -period 10 -name default

config_compile -ignore_long_run_time
set_part {xczu3eg-sbva484-1-e}

csynth_design


ignore_long_run_time.tcl を vivado_hls ignore_long_run_time.tcl で実行したが、やはり同様のエラーだった。ログを示す。

masaaki@masaaki-H110M4-M01:~/Vivado_HLS/Ultra96/NN/all_deploy_afnet4mnist3$ vivado_hls ignore_long_run_time.tcl 

****** Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC v2018.3 (64-bit)
  **** SW Build 2405991 on Thu Dec  6 23:36:41 MST 2018
  **** IP Build 2404404 on Fri Dec  7 01:43:56 MST 2018
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.

source /tools/Xilinx/Vivado/2018.3/scripts/vivado_hls/hls.tcl -notrace
INFO: [HLS 200-10] Running '/tools/Xilinx/Vivado/2018.3/bin/unwrapped/lnx64.o/vivado_hls'
INFO: [HLS 200-10] For user 'masaaki' on host 'masaaki-H110M4-M01' (Linux_x86_64 version 4.15.0-46-generic) on Sat Mar 30 12:31:54 JST 2019
INFO: [HLS 200-10] On os Ubuntu 18.04.2 LTS
INFO: [HLS 200-10] In directory '/home/masaaki/Vivado_HLS/Ultra96/NN/all_deploy_afnet4mnist3'
WARNING: [HLS 200-40] Environment variable 'C_INCLUDE_PATH' is set to :/usr/local/cuda/include.
INFO: [HLS 200-10] Opening project '/home/masaaki/Vivado_HLS/Ultra96/NN/all_deploy_afnet4mnist3/all_deploy_afnet4mnist3'.
INFO: [HLS 200-10] Adding design file 'mnist_nn.cpp' to the project
INFO: [HLS 200-10] Opening solution '/home/masaaki/Vivado_HLS/Ultra96/NN/all_deploy_afnet4mnist3/all_deploy_afnet4mnist3/solution1'.
INFO: [SYN 201-201] Setting up clock 'default' with a period of 10ns.
INFO: [HLS 200-10] Setting target device to 'xczu3eg-sbva484-1-e'
WARNING: [ANALYSIS 214-1] Skip long-run-time warning caused by lots of load/store instructions.
WARNING: [ANALYSIS 214-1] Skip long-run-time warning caused by lots of load/store instructions.
INFO: [SCHED 204-61] Option 'relax_ii_for_timing' is enabled, will increase II to preserve clock frequency constraints.
INFO: [HLS 200-10] Analyzing design file 'mnist_nn.cpp' ... 
INFO: [HLS 200-111] Finished Linking Time (s): cpu = 00:00:19 ; elapsed = 00:00:20 . Memory (MB): peak = 452.242 ; gain = 13.375 ; free physical = 25266 ; free virtual = 43474
INFO: [HLS 200-111] Finished Checking Pragmas Time (s): cpu = 00:00:19 ; elapsed = 00:00:20 . Memory (MB): peak = 452.242 ; gain = 13.375 ; free physical = 25266 ; free virtual = 43474
INFO: [HLS 200-10] Starting code transformations ...
INFO: [HLS 200-111] Finished Standard Transforms Time (s): cpu = 00:00:27 ; elapsed = 00:00:28 . Memory (MB): peak = 581.059 ; gain = 142.191 ; free physical = 25221 ; free virtual = 43429
INFO: [HLS 200-10] Checking synthesizability ...
INFO: [HLS 200-111] Finished Checking Synthesizability Time (s): cpu = 00:00:27 ; elapsed = 00:00:28 . Memory (MB): peak = 581.059 ; gain = 142.191 ; free physical = 25221 ; free virtual = 43429
INFO: [XFORM 203-502] Unrolling all sub-loops inside loop 'num_of_iter' (mnist_nn.cpp:839) in function 'mnist_nn' for pipelining.
INFO: [HLS 200-489] Unrolling loop 'af1_dot1' (mnist_nn.cpp:841) in function 'mnist_nn' completely with a factor of 20.
ERROR: [XFORM 203-504] Stop unrolling loop 'af1_dot1' (mnist_nn.cpp:841) in function 'mnist_nn' because it may cause large runtime and excessive memory usage due to increase in code size. Please avoid unrolling the loop or form sub-functions for code in the loop body.
ERROR: [HLS 200-70] Pre-synthesis failed.
command 'ap_source' returned error code
    while executing
"source ignore_long_run_time.tcl"
    invoked from within
"hls::main ignore_long_run_time.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 hls::main {*}$args"
    (procedure "hls_proc" line 5)
    invoked from within
"hls_proc $argv"
INFO: [Common 17-206] Exiting vivado_hls at Sat Mar 30 12:32:22 2019...


Viavdo HLS 2018.3 の能力の限界なのか?古いVivado HLS でやればもしかしたら行けるのかもしれない?
  1. 2019年03月31日 05:45 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/4486-db4dd157
この記事にトラックバックする(FC2ブログユーザー)