Commit 1fc5e482 authored by Kento HASEGAWA's avatar Kento HASEGAWA

Update several parameters for search

parent 49b4fd83
...@@ -58,7 +58,7 @@ int main(int argc, char *argv[]) { ...@@ -58,7 +58,7 @@ int main(int argc, char *argv[]) {
ap_int<32> status; ap_int<32> status;
clock_t clock_start, clock_done; clock_t clock_start, clock_done;
clock_start = clock(); clock_start = clock();
bool result = pynqrouter(boardstr, seed, &status); bool result = pynqrouter_zu3eg_test(boardstr, seed, &status);
clock_done = clock(); clock_done = clock();
if (result) { if (result) {
cout << endl << "Test Passed!" << endl; cout << endl << "Test Passed!" << endl;
......
...@@ -58,7 +58,7 @@ int main(int argc, char *argv[]) { ...@@ -58,7 +58,7 @@ int main(int argc, char *argv[]) {
ap_int<32> status; ap_int<32> status;
clock_t clock_start, clock_done; clock_t clock_start, clock_done;
clock_start = clock(); clock_start = clock();
bool result = pynqrouter(boardstr, seed, &status); bool result = pynqrouter_256x128(boardstr, seed, &status);
clock_done = clock(); clock_done = clock();
if (result) { if (result) {
cout << endl << "Test Passed!" << endl; cout << endl << "Test Passed!" << endl;
......
...@@ -84,7 +84,7 @@ static ap_uint<7> size_x; // ボードの X サイズ ...@@ -84,7 +84,7 @@ static ap_uint<7> size_x; // ボードの X サイズ
static ap_uint<7> size_y; // ボードの Y サイズ static ap_uint<7> size_y; // ボードの Y サイズ
static ap_uint<4> size_z; // ボードの Z サイズ static ap_uint<4> size_z; // ボードの Z サイズ
static ap_uint<7> line_num = 0; // ラインの総数 static ap_uint<8> line_num = 0; // ラインの総数
// グローバル変数で定義する // グローバル変数で定義する
#ifdef GLOBALVARS #ifdef GLOBALVARS
...@@ -131,7 +131,7 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 ...@@ -131,7 +131,7 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3
// ループカウンタは1ビット余分に用意しないと終了判定できない // ループカウンタは1ビット余分に用意しないと終了判定できない
INIT_ADJACENTS: 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; adjacents[i] = false;
} }
...@@ -208,8 +208,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 ...@@ -208,8 +208,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3
// [Step 1] 初期ルーティング // [Step 1] 初期ルーティング
cout << "Initial Routing" << endl; cout << "Initial Routing" << endl;
FIRST_ROUTING: FIRST_ROUTING:
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_TRIPCOUNT min=2 max=127 avg=50 #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 PIPELINE
//#pragma HLS UNROLL factor=2 //#pragma HLS UNROLL factor=2
...@@ -231,9 +232,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 ...@@ -231,9 +232,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3
#ifndef USE_MOD_CALC #ifndef USE_MOD_CALC
// line_num_2: line_num 以上で最小の2のべき乗数 // line_num_2: line_num 以上で最小の2のべき乗数
ap_uint<8> line_num_2; ap_uint<9> line_num_2;
CALC_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 #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 ...@@ -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); ap_uint<8> current_round_weight = new_weight(round);
//cout << " weight " << current_round_weight << endl; //cout << " weight " << current_round_weight << endl;
ROUTING_UPDATE: ROUTING_UPDATE:
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_TRIPCOUNT min=2 max=127 avg=50 #pragma HLS LOOP_TRIPCOUNT min=2 max=255 avg=50
// 数字が隣接する場合スキップ、そうでない場合は実行 // 数字が隣接する場合スキップ、そうでない場合は実行
if (adjacents[i] == false && i != target) { if (adjacents[i] == false && i != target) {
...@@ -322,9 +323,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3 ...@@ -322,9 +323,9 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3
overlap_checks[i] = 0; overlap_checks[i] = 0;
} }
OVERLAP_CHECK: 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_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[starts[i]] = 1;
overlap_checks[goals[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 ...@@ -376,8 +377,8 @@ bool pynqrouter_256x128(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<3
// このソルバでのラインIDを+1して表示する // このソルバでのラインIDを+1して表示する
// なぜなら空白を 0 で表すことにするからラインIDは 1 以上にしたい // なぜなら空白を 0 で表すことにするからラインIDは 1 以上にしたい
OUTPUT_LINE: OUTPUT_LINE:
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_TRIPCOUNT min=2 max=127 avg=50 #pragma HLS LOOP_TRIPCOUNT min=2 max=255 avg=50
boardstr[starts[i]] = (i + 1); boardstr[starts[i]] = (i + 1);
boardstr[goals[i]] = (i + 1); boardstr[goals[i]] = (i + 1);
OUTPUT_LINE_PATH: OUTPUT_LINE_PATH:
...@@ -438,14 +439,14 @@ void search(ap_uint<8> *path_size, ap_uint<16> path[MAX_PATH], ap_uint<16> start ...@@ -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]; ap_uint<32> pq_nodes[MAX_PQ];
//#pragma HLS ARRAY_PARTITION variable=pq_nodes complete dim=1 //#pragma HLS ARRAY_PARTITION variable=pq_nodes complete dim=1
//#pragma HLS ARRAY_PARTITION variable=pq_nodes cyclic factor=2 dim=1 partition //#pragma HLS ARRAY_PARTITION variable=pq_nodes cyclic factor=2 dim=1 partition
#ifdef DEBUG_PRINT #ifdef DEBUG_PRINT
// キューの最大長さチェック用 // キューの最大長さチェック用
ap_uint<12> max_pq_len = 0; ap_uint<13> max_pq_len = 0;
#endif #endif
#ifdef USE_ASTAR #ifdef USE_ASTAR
...@@ -671,12 +672,12 @@ void search(ap_uint<8> *path_size, ap_uint<16> path[MAX_PATH], ap_uint<16> start ...@@ -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 #pragma HLS INLINE
(*pq_len)++; (*pq_len)++;
ap_uint<12> i = (*pq_len); // target ap_uint<13> i = (*pq_len); // target
ap_uint<12> p = (*pq_len) >> 1; // i.e., (*pq_len) / 2; // 親 ap_uint<13> p = (*pq_len) >> 1; // i.e., (*pq_len) / 2; // 親
PQ_PUSH_LOOP: PQ_PUSH_LOOP:
while (i > 1 && (ap_uint<16>)(pq_nodes[p] & PQ_PRIORITY_MASK) >= priority) { while (i > 1 && (ap_uint<16>)(pq_nodes[p] & PQ_PRIORITY_MASK) >= priority) {
#pragma HLS LOOP_TRIPCOUNT min=1 max=8 avg=4 #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 ...@@ -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 #pragma HLS INLINE
*ret_priority = (ap_uint<16>)(pq_nodes[1] & PQ_PRIORITY_MASK); *ret_priority = (ap_uint<16>)(pq_nodes[1] & PQ_PRIORITY_MASK);
*ret_data = (ap_uint<16>)(pq_nodes[1] >> PQ_PRIORITY_WIDTH); *ret_data = (ap_uint<16>)(pq_nodes[1] >> PQ_PRIORITY_WIDTH);
//pq_nodes[1] = pq_nodes[*pq_len]; //pq_nodes[1] = pq_nodes[*pq_len];
ap_uint<12> i = 1; // 親ノード ap_uint<13> i = 1; // 親ノード
//ap_uint<12> t = 1; // 交換対象ノード //ap_uint<13> t = 1; // 交換対象ノード
ap_uint<16> last_priority = (ap_uint<16>)(pq_nodes[*pq_len] & PQ_PRIORITY_MASK); // 末尾ノードの優先度 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 ...@@ -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 LOOP_TRIPCOUNT min=1 max=8 avg=4
//#pragma HLS PIPELINE //#pragma HLS PIPELINE
//#pragma HLS UNROLL factor=2 //#pragma HLS UNROLL factor=2
ap_uint<12> c1 = i << 1; // i.e., 2 * i; // 左の子 ap_uint<13> c1 = i << 1; // i.e., 2 * i; // 左の子
ap_uint<12> c2 = c1 + 1; // i.e., 2 * i + 1; // 右の子 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 (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)) { 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]; pq_nodes[i] = pq_nodes[c2];
......
...@@ -31,7 +31,7 @@ using namespace std; ...@@ -31,7 +31,7 @@ using namespace std;
#define MAX_CELLS 41472 // セルの総数 =72*72*8 (16ビットで収まる) #define MAX_CELLS 41472 // セルの総数 =72*72*8 (16ビットで収まる)
#define MAX_LINES 256 // ライン数の最大値 (7ビット) #define MAX_LINES 256 // ライン数の最大値 (7ビット)
#define MAX_PATH 128 // 1つのラインが対応するセル数の最大値 (8ビット) #define MAX_PATH 128 // 1つのラインが対応するセル数の最大値 (8ビット)
#define MAX_PQ 4096 // 探索時のプライオリティ・キューの最大サイズ (12ビット) 足りないかも? #define MAX_PQ 8192 // 探索時のプライオリティ・キューの最大サイズ (12ビット) 足りないかも?
#define PQ_PRIORITY_WIDTH 16 #define PQ_PRIORITY_WIDTH 16
#define PQ_PRIORITY_MASK 65535 // 0000 0000 0000 0000 1111 1111 1111 1111 #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); ...@@ -56,7 +56,7 @@ ap_uint<3> abs_uint3(ap_uint<3> a, ap_uint<3> b);
#endif #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 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_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<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]);
#endif /* __ROUTER_HPP__ */ #endif /* __ROUTER_HPP__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment