Add the multi_threads algorithm

This commit is contained in:
Rodolphe Bréard 2024-10-30 23:39:03 +01:00
parent 7fc15efb1a
commit 2038cb93ee
4 changed files with 13 additions and 1 deletions

View file

@ -65,6 +65,8 @@ algorithms in Rust and benchmark them. Let the battle begin.
- `single thread`: No multi-threading or any optimization of any kind. Used as
a reference.
- `multi threads`: Manual multi-threading but no optimization of any kind. Used
as a reference.
- `lpt`: Manual multi-threading. Tasks are sorted so the shortest ones are
executed first. This is the [longest-processing-time-first algorithm][lpt].
- `rayon`: Multi-threading provided by the `rayon` crate, but no optimization

View file

@ -6,6 +6,7 @@ use rust_job_scheduling::Task;
const TEST_DATA: &[(&str, &[Task])] = &[("10 tasks", T_10), ("500 tasks", T_500)];
const TEST_FUNCS: &[(&str, &dyn Fn(&[Task]))] = &[
("single thread", &single_thread),
("multi threads", &multi_threads),
("lpt", &lpt),
("rayon", &rayon),
("rayon sorted", &rayon_sorted),

View file

@ -2,6 +2,6 @@ mod lpt;
mod rayon;
mod single_thread;
pub use lpt::lpt;
pub use lpt::*;
pub use rayon::*;
pub use single_thread::single_thread;

View file

@ -5,7 +5,16 @@ use std::thread;
pub fn lpt(data: &[Task]) {
let mut data = data.to_vec();
data.sort();
run_multi(data);
}
pub fn multi_threads(data: &[Task]) {
let data = data.to_vec();
run_multi(data);
}
#[inline(always)]
fn run_multi(data: Vec<Task>) {
let data_mt = Arc::new(Mutex::new(data));
let nb_threads = thread::available_parallelism()
.map(|n| n.get())