From 1fc5e48299ea8cb10a17cf138dfea3719cf6b489 Mon Sep 17 00:00:00 2001 From: Kento HASEGAWA Date: Thu, 9 Aug 2018 15:33:21 +0900 Subject: [PATCH] Update several parameters for search --- hls/ZU3EG_test/main.cpp | 2 +- hls/lines256_length128/main.cpp | 2 +- hls/lines256_length128/router.cpp | 45 ++++++++++++++++--------------- hls/lines256_length128/router.hpp | 6 ++--- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/hls/ZU3EG_test/main.cpp b/hls/ZU3EG_test/main.cpp index 41f1f51..15026a6 100644 --- a/hls/ZU3EG_test/main.cpp +++ b/hls/ZU3EG_test/main.cpp @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) { ap_int<32> status; clock_t clock_start, clock_done; clock_start = clock(); - bool result = pynqrouter(boardstr, seed, &status); + bool result = pynqrouter_zu3eg_test(boardstr, seed, &status); clock_done = clock(); if (result) { cout << endl << "Test Passed!" << endl; diff --git a/hls/lines256_length128/main.cpp b/hls/lines256_length128/main.cpp index e7089f2..3803393 100644 --- a/hls/lines256_length128/main.cpp +++ b/hls/lines256_length128/main.cpp @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) { ap_int<32> status; clock_t clock_start, clock_done; clock_start = clock(); - bool result = pynqrouter(boardstr, seed, &status); + bool result = pynqrouter_256x128(boardstr, seed, &status); clock_done = clock(); if (result) { cout << endl << "Test Passed!" << endl; diff --git a/hls/lines256_length128/router.cpp b/hls/lines256_length128/router.cpp index 36cdb6f..08eb1f5 100644 --- a/hls/lines256_length128/router.cpp +++ b/hls/lines256_length128/router.cpp @@ -84,7 +84,7 @@ static ap_uint<7> size_x; // ボードの X サイズ static ap_uint<7> size_y; // ボードの Y サイズ static ap_uint<4> size_z; // ボードの Z サイズ -static ap_uint<7> line_num = 0; // ラインの総数 +static ap_uint<8> line_num = 0; // ラインの総数 // グローバル変数で定義する #ifdef GLOBALVARS @@ -131,7 +131,7 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 // ループカウンタは1ビット余分に用意しないと終了判定できない INIT_ADJACENTS: - for (ap_uint<8> i = 0; i < (ap_uint<8>)(MAX_LINES); i++) { + for (ap_uint<9> i = 0; i < (ap_uint<9>)(MAX_LINES); i++) { adjacents[i] = false; } @@ -208,8 +208,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 // [Step 1] 初期ルーティング cout << "Initial Routing" << endl; FIRST_ROUTING: - for (ap_uint<8> i = 0; i < (ap_uint<8>)(line_num); i++) { -#pragma HLS LOOP_TRIPCOUNT min=2 max=127 avg=50 + for (ap_uint<9> i = 0; i < (ap_uint<9>)(line_num); i++) { +#pragma HLS LOOP_TRIPCOUNT min=2 max=255 avg=50 +//#pragma HLS LOOP_TRIPCOUNT min=2 max=127 avg=50 //#pragma HLS PIPELINE //#pragma HLS UNROLL factor=2 @@ -231,9 +232,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 #ifndef USE_MOD_CALC // line_num_2: line_num 以上で最小の2のべき乗数 - ap_uint<8> line_num_2; + ap_uint<9> line_num_2; CALC_LINE_NUM_2: - for (line_num_2 = 1; line_num_2 < (ap_uint<8>)line_num; line_num_2 *= 2) { + for (line_num_2 = 1; line_num_2 < (ap_uint<9>)line_num; line_num_2 *= 2) { #pragma HLS LOOP_TRIPCOUNT min=1 max=8 avg=4 ; } @@ -291,8 +292,8 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 ap_uint<8> current_round_weight = new_weight(round); //cout << " weight " << current_round_weight << endl; ROUTING_UPDATE: - for (ap_uint<8> i = 0; i < (ap_uint<8>)(line_num); i++) { -#pragma HLS LOOP_TRIPCOUNT min=2 max=127 avg=50 + for (ap_uint<9> i = 0; i < (ap_uint<9>)(line_num); i++) { +#pragma HLS LOOP_TRIPCOUNT min=2 max=255 avg=50 // 数字が隣接する場合スキップ、そうでない場合は実行 if (adjacents[i] == false && i != target) { @@ -322,9 +323,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 overlap_checks[i] = 0; } OVERLAP_CHECK: - for (ap_uint<8> i = 0; i < (ap_uint<8>)(line_num); i++) { + for (ap_uint<9> i = 0; i < (ap_uint<9>)(line_num); i++) { #pragma HLS LOOP_FLATTEN off -#pragma HLS LOOP_TRIPCOUNT min=2 max=127 avg=50 +#pragma HLS LOOP_TRIPCOUNT min=2 max=255 avg=50 overlap_checks[starts[i]] = 1; overlap_checks[goals[i]] = 1; @@ -376,8 +377,8 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 // このソルバでのラインIDを+1して表示する // なぜなら空白を 0 で表すことにするからラインIDは 1 以上にしたい OUTPUT_LINE: - for (ap_uint<8> i = 0; i < (ap_uint<8>)(line_num); i++) { -#pragma HLS LOOP_TRIPCOUNT min=2 max=127 avg=50 + for (ap_uint<9> i = 0; i < (ap_uint<9>)(line_num); i++) { +#pragma HLS LOOP_TRIPCOUNT min=2 max=255 avg=50 boardstr[starts[i]] = (i + 1); boardstr[goals[i]] = (i + 1); OUTPUT_LINE_PATH: @@ -438,14 +439,14 @@ void search(ap_uint<8> *path_size, ap_uint<16> path[MAX_PATH], ap_uint<16> start } // プライオリティ・キュー - ap_uint<12> pq_len = 0; + ap_uint<13> pq_len = 0; ap_uint<32> pq_nodes[MAX_PQ]; //#pragma HLS ARRAY_PARTITION variable=pq_nodes complete dim=1 //#pragma HLS ARRAY_PARTITION variable=pq_nodes cyclic factor=2 dim=1 partition #ifdef DEBUG_PRINT // キューの最大長さチェック用 - ap_uint<12> max_pq_len = 0; + ap_uint<13> max_pq_len = 0; #endif #ifdef USE_ASTAR @@ -671,12 +672,12 @@ void search(ap_uint<8> *path_size, ap_uint<16> path[MAX_PATH], ap_uint<16> start // ノードの挿入は,末尾に追加してから優先度が正しい高さの位置までノードを上げていく // 探索の都合上,同じ優先度では後から入れた方を先に出したいから, // ループの終了条件は挿入ノードの優先度が比較対象の優先度よりも小さくなったとき -void pq_push(ap_uint<16> priority, ap_uint<16> data, ap_uint<12> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]) { +void pq_push(ap_uint<16> priority, ap_uint<16> data, ap_uint<13> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]) { #pragma HLS INLINE (*pq_len)++; - ap_uint<12> i = (*pq_len); // target - ap_uint<12> p = (*pq_len) >> 1; // i.e., (*pq_len) / 2; // 親 + ap_uint<13> i = (*pq_len); // target + ap_uint<13> p = (*pq_len) >> 1; // i.e., (*pq_len) / 2; // 親 PQ_PUSH_LOOP: while (i > 1 && (ap_uint<16>)(pq_nodes[p] & PQ_PRIORITY_MASK) >= priority) { #pragma HLS LOOP_TRIPCOUNT min=1 max=8 avg=4 @@ -694,15 +695,15 @@ void pq_push(ap_uint<16> priority, ap_uint<16> data, ap_uint<12> *pq_len, ap_uin // まず,末尾のノードをルートに移動する // 両方の子で優先度が小さい方を上にもっていく (ルートを適切な高さまで下げる) // これを再帰的に繰り返す -void pq_pop(ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint<12> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]) { +void pq_pop(ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint<13> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]) { #pragma HLS INLINE *ret_priority = (ap_uint<16>)(pq_nodes[1] & PQ_PRIORITY_MASK); *ret_data = (ap_uint<16>)(pq_nodes[1] >> PQ_PRIORITY_WIDTH); //pq_nodes[1] = pq_nodes[*pq_len]; - ap_uint<12> i = 1; // 親ノード - //ap_uint<12> t = 1; // 交換対象ノード + ap_uint<13> i = 1; // 親ノード + //ap_uint<13> t = 1; // 交換対象ノード ap_uint<16> last_priority = (ap_uint<16>)(pq_nodes[*pq_len] & PQ_PRIORITY_MASK); // 末尾ノードの優先度 @@ -711,8 +712,8 @@ void pq_pop(ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint<12> *pq_le #pragma HLS LOOP_TRIPCOUNT min=1 max=8 avg=4 //#pragma HLS PIPELINE //#pragma HLS UNROLL factor=2 - ap_uint<12> c1 = i << 1; // i.e., 2 * i; // 左の子 - ap_uint<12> c2 = c1 + 1; // i.e., 2 * i + 1; // 右の子 + ap_uint<13> c1 = i << 1; // i.e., 2 * i; // 左の子 + ap_uint<13> c2 = c1 + 1; // i.e., 2 * i + 1; // 右の子 if (c1 < *pq_len && (ap_uint<16>)(pq_nodes[c1] & PQ_PRIORITY_MASK) <= last_priority) { if (c2 < *pq_len && (ap_uint<16>)(pq_nodes[c2] & PQ_PRIORITY_MASK) <= (ap_uint<16>)(pq_nodes[c1] & PQ_PRIORITY_MASK)) { pq_nodes[i] = pq_nodes[c2]; diff --git a/hls/lines256_length128/router.hpp b/hls/lines256_length128/router.hpp index 6100341..b0d9522 100644 --- a/hls/lines256_length128/router.hpp +++ b/hls/lines256_length128/router.hpp @@ -31,7 +31,7 @@ using namespace std; #define MAX_CELLS 41472 // セルの総数 =72*72*8 (16ビットで収まる) #define MAX_LINES 256 // ライン数の最大値 (7ビット) #define MAX_PATH 128 // 1つのラインが対応するセル数の最大値 (8ビット) -#define MAX_PQ 4096 // 探索時のプライオリティ・キューの最大サイズ (12ビット) 足りないかも? +#define MAX_PQ 8192 // 探索時のプライオリティ・キューの最大サイズ (12ビット) 足りないかも? #define PQ_PRIORITY_WIDTH 16 #define PQ_PRIORITY_MASK 65535 // 0000 0000 0000 0000 1111 1111 1111 1111 @@ -56,7 +56,7 @@ ap_uint<3> abs_uint3(ap_uint<3> a, ap_uint<3> b); #endif void search(ap_uint<8> *path_size, ap_uint<16> path[MAX_PATH], ap_uint<16> start, ap_uint<16> goal, ap_uint<8> w[MAX_WEIGHT]); -void pq_push(ap_uint<16> priority, ap_uint<16> data, ap_uint<12> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]); -void pq_pop(ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint<12> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]); +void pq_push(ap_uint<16> priority, ap_uint<16> data, ap_uint<13> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]); +void pq_pop(ap_uint<16> *ret_priority, ap_uint<16> *ret_data, ap_uint<13> *pq_len, ap_uint<32> pq_nodes[MAX_PQ]); #endif /* __ROUTER_HPP__ */ -- 2.22.0