parameterise tree size in join example

This commit is contained in:
Janis 2025-06-28 08:56:48 +02:00
parent a1e1c90f90
commit 8b4eba5a19
4 changed files with 49 additions and 38 deletions

View file

@ -11,7 +11,6 @@ work-stealing = []
prefer-local = [] prefer-local = []
never-local = [] never-local = []
[profile.bench] [profile.bench]
debug = true debug = true
@ -48,4 +47,5 @@ cfg-if = "1.0.0"
[dev-dependencies] [dev-dependencies]
async-std = "1.13.0" async-std = "1.13.0"
tracing-test = "0.2.5" tracing-test = "0.2.5"
tracing-tracy = "0.11.4"
distaff = {path = "distaff"} distaff = {path = "distaff"}

View file

@ -74,10 +74,6 @@ impl HeartbeatListInner {
} }
} }
fn iter(&self) -> std::collections::btree_map::Values<'_, u64, HeartbeatSender> {
self.heartbeats.values()
}
fn notify_nth(&mut self, n: usize) { fn notify_nth(&mut self, n: usize) {
if let Some((_, heartbeat)) = self.heartbeats.iter_mut().nth(n) { if let Some((_, heartbeat)) = self.heartbeats.iter_mut().nth(n) {
heartbeat.set(); heartbeat.set();

View file

@ -67,20 +67,22 @@ impl WorkerThread {
fn run_inner(&self) { fn run_inner(&self) {
let mut job = None; let mut job = None;
'outer: loop { 'outer: loop {
if let Some(job) = job { if let Some(job) = job.take() {
self.execute(job); self.execute(job);
} }
// no more jobs, wait to be notified of a new job or a heartbeat.
while job.is_none() {
if self.context.should_exit() { if self.context.should_exit() {
// if the context is stopped, break out of the outer loop which // if the context is stopped, break out of the outer loop which
// will exit the thread. // will exit the thread.
break 'outer; break 'outer;
} }
// no more jobs, wait to be notified of a new job or a heartbeat.
job = self.find_work_or_wait(); job = self.find_work_or_wait();
} }
} }
}
} }
impl WorkerThread { impl WorkerThread {

View file

@ -4,10 +4,10 @@ use executor::util::tree::Tree;
const TREE_SIZE: usize = 16; const TREE_SIZE: usize = 16;
fn join_scope() { fn join_scope(tree_size: usize) {
let pool = ThreadPool::new(); let pool = ThreadPool::new();
let tree = Tree::new(TREE_SIZE, 1); let tree = Tree::new(tree_size, 1);
fn sum(tree: &Tree<u32>, node: usize, scope: &Scope) -> u32 { fn sum(tree: &Tree<u32>, node: usize, scope: &Scope) -> u32 {
let node = tree.get(node); let node = tree.get(node);
@ -31,10 +31,10 @@ fn join_scope() {
} }
} }
fn join_pool() { fn join_pool(tree_size: usize) {
let pool = ThreadPool::new(); let pool = ThreadPool::new();
let tree = Tree::new(TREE_SIZE, 1); let tree = Tree::new(tree_size, 1);
fn sum(tree: &Tree<u32>, node: usize, pool: &ThreadPool) -> u32 { fn sum(tree: &Tree<u32>, node: usize, pool: &ThreadPool) -> u32 {
let node = tree.get(node); let node = tree.get(node);
@ -60,10 +60,10 @@ fn join_pool() {
eprintln!("sum: {sum}"); eprintln!("sum: {sum}");
} }
fn join_distaff() { fn join_distaff(tree_size: usize) {
use distaff::*; use distaff::*;
let pool = ThreadPool::new(); let pool = ThreadPool::new();
let tree = Tree::new(TREE_SIZE, 1); let tree = Tree::new(tree_size, 1);
fn sum<'scope, 'env>(tree: &Tree<u32>, node: usize, scope: &'scope Scope<'scope, 'env>) -> u32 { fn sum<'scope, 'env>(tree: &Tree<u32>, node: usize, scope: &'scope Scope<'scope, 'env>) -> u32 {
let node = tree.get(node); let node = tree.get(node);
@ -81,17 +81,15 @@ fn join_distaff() {
node.leaf + l + r node.leaf + l + r
} }
for _ in 0..1000 {
let sum = pool.scope(|s| { let sum = pool.scope(|s| {
let sum = sum(&tree, tree.root().unwrap(), s); let sum = sum(&tree, tree.root().unwrap(), s);
sum sum
}); });
std::hint::black_box(sum); std::hint::black_box(sum);
}
} }
fn join_chili() { fn join_chili(tree_size: usize) {
let tree = Tree::new(TREE_SIZE, 1u32); let tree = Tree::new(tree_size, 1u32);
fn sum(tree: &Tree<u32>, node: usize, scope: &mut chili::Scope<'_>) -> u32 { fn sum(tree: &Tree<u32>, node: usize, scope: &mut chili::Scope<'_>) -> u32 {
let node = tree.get(node); let node = tree.get(node);
@ -113,8 +111,8 @@ fn join_chili() {
} }
} }
fn join_rayon() { fn join_rayon(tree_size: usize) {
let tree = Tree::new(TREE_SIZE, 1u32); let tree = Tree::new(tree_size, 1u32);
fn sum(tree: &Tree<u32>, node: usize) -> u32 { fn sum(tree: &Tree<u32>, node: usize) -> u32 {
let node = tree.get(node); let node = tree.get(node);
@ -133,19 +131,34 @@ fn join_rayon() {
} }
fn main() { fn main() {
tracing_subscriber::fmt::init(); // use tracing_subscriber::layer::SubscriberExt;
// tracing::subscriber::set_global_default(
// tracing_subscriber::registry().with(tracing_tracy::TracyLayer::default()),
// )
// .expect("Failed to set global default subscriber");
let size = std::env::args()
.nth(2)
.and_then(|s| s.parse::<usize>().ok())
.unwrap_or(TREE_SIZE);
match std::env::args().nth(1).as_deref() { match std::env::args().nth(1).as_deref() {
Some("scope") => join_scope(), Some("scope") => join_scope(size),
Some("pool") => join_pool(), Some("pool") => join_pool(size),
Some("chili") => join_chili(), Some("chili") => join_chili(size),
Some("distaff") => join_distaff(), Some("distaff") => join_distaff(size),
Some("rayon") => join_rayon(), Some("rayon") => join_rayon(size),
_ => { _ => {
eprintln!( eprintln!(
"Usage: {} [scope|pool|chili|distaff|rayon]", "Usage: {} [scope|pool|chili|distaff|rayon] <tree_size={}>",
std::env::args().next().unwrap() std::env::args().next().unwrap(),
TREE_SIZE
); );
return; return;
} }
} }
eprintln!("Done!");
// wait for user input before exiting
// std::io::stdin().read_line(&mut String::new()).unwrap();
} }