From 9c0b88dd1488db05a503fd8c6a2a5b5122123ffe Mon Sep 17 00:00:00 2001 From: primenumber Date: Sat, 4 May 2024 20:11:42 +0900 Subject: [PATCH] Limit number of CPUs --- src/book.rs | 2 +- src/engine/midgame.rs | 4 +++- src/engine/search.rs | 23 ++++++++++++++++++++--- src/main.rs | 1 + src/play.rs | 8 ++++---- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/book.rs b/src/book.rs index 6c53cf2..ca37687 100644 --- a/src/book.rs +++ b/src/book.rs @@ -173,7 +173,7 @@ fn search(board: Board, think_time_limit: u128, solve_obj: &mut SolveObj, sub_so solve_obj.cache_gen += 1; if board.empty().count_ones() <= 18 { let mut solve_obj = solve_obj.clone(); - solve_with_move(board, &mut solve_obj, &sub_solver.clone()) + solve_with_move(board, &mut solve_obj, &sub_solver.clone(), None) } else { let start = Instant::now(); let timer = Timer { diff --git a/src/engine/midgame.rs b/src/engine/midgame.rs index eea60b5..c5bb36d 100644 --- a/src/engine/midgame.rs +++ b/src/engine/midgame.rs @@ -148,12 +148,14 @@ pub fn simplified_abdada( (alpha, beta): (i8, i8), passed: bool, depth: i8, + num_threads: Option, ) -> (i8, Option, SolveStat) { thread::scope(|s| { let mut handles = Vec::new(); let cs_hash = Arc::new(DashSet::new()); let finished = Arc::new(AtomicBool::new(false)); - for _ in 0..num_cpus::get() { + let num_threads = num_threads.unwrap_or(num_cpus::get()); + for _ in 0..num_threads { let solve_obj = solve_obj.clone(); let cs_hash = cs_hash.clone(); let finished = finished.clone(); diff --git a/src/engine/search.rs b/src/engine/search.rs index 4e85385..b170ca9 100644 --- a/src/engine/search.rs +++ b/src/engine/search.rs @@ -272,6 +272,7 @@ pub fn move_ordering_impl(solve_obj: &mut SolveObj, board: Board, _old_best: Opt } } +// num_threads: number of searching threads, use number of cpus when None pub fn solve( solve_obj: &mut SolveObj, _worker_urls: &[String], @@ -279,17 +280,25 @@ pub fn solve( (alpha, beta): (i8, i8), passed: bool, depth: i8, + num_threads: Option, ) -> (i8, Option, SolveStat) { - simplified_abdada(solve_obj, board, (alpha, beta), passed, depth) + simplified_abdada(solve_obj, board, (alpha, beta), passed, depth, num_threads) } -pub fn solve_with_move(board: Board, solve_obj: &mut SolveObj, _sub_solver: &Arc) -> Hand { +// num_threads: number of searching threads, use number of cpus when None +pub fn solve_with_move( + board: Board, + solve_obj: &mut SolveObj, + _sub_solver: &Arc, + num_threads: Option, +) -> Hand { if let Some(best) = simplified_abdada( solve_obj, board, (-(BOARD_SIZE as i8), BOARD_SIZE as i8), false, 0, + num_threads, ) .1 { @@ -299,7 +308,15 @@ pub fn solve_with_move(board: Board, solve_obj: &mut SolveObj, _sub_solver: &Arc let mut result = -65; for pos in board.mobility() { let next = board.play(pos).unwrap(); - let res = -simplified_abdada(solve_obj, next, (-(BOARD_SIZE as i8), -result), false, 0).0; + let res = -simplified_abdada( + solve_obj, + next, + (-(BOARD_SIZE as i8), -result), + false, + 0, + num_threads, + ) + .0; if res > result { result = res; best_pos = Some(pos); diff --git a/src/main.rs b/src/main.rs index 002ec68..8812f4e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -87,6 +87,7 @@ fn solve_ffo(name: &str, index: &mut usize, solve_obj: &mut SolveObj, workers: & (-(BOARD_SIZE as i8), BOARD_SIZE as i8), false, 0, + None, ); let end = start.elapsed(); let milli_seconds = end.as_millis() + 1; // ceil up, avoid zero-division diff --git a/src/play.rs b/src/play.rs index 5e85c71..c4b29f4 100644 --- a/src/play.rs +++ b/src/play.rs @@ -64,7 +64,7 @@ pub fn play(matches: &ArgMatches) -> Board { best } else { let mut solve_obj = solve_obj.clone(); - solve_with_move(board.board, &mut solve_obj, &sub_solver) + solve_with_move(board.board, &mut solve_obj, &sub_solver, None) }; solve_obj.cache_gen += 1; best @@ -120,7 +120,7 @@ pub fn self_play(matches: &ArgMatches) -> Board { best } else { let mut solve_obj = solve_obj.clone(); - solve_with_move(board.board, &mut solve_obj, &sub_solver) + solve_with_move(board.board, &mut solve_obj, &sub_solver, None) }; solve_obj.cache_gen += 1; let hand = best; @@ -173,7 +173,7 @@ fn self_play_worker(mut solve_obj: SolveObj, sub_solver: Arc, initial best } else { let mut obj = solve_obj.clone(); - solve_with_move(board.board, &mut obj, &sub_solver) + solve_with_move(board.board, &mut obj, &sub_solver, Some(1)) }; solve_obj.cache_gen += 1; let hand = best; @@ -349,7 +349,7 @@ pub fn codingame(_matches: &ArgMatches) -> Result<(), Box best } else { let mut solve_obj = solve_obj.clone(); - solve_with_move(board.board, &mut solve_obj, &sub_solver) + solve_with_move(board.board, &mut solve_obj, &sub_solver, None) }; solve_obj.cache_gen += 1; match best {