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 = []
never-local = []
[profile.bench]
debug = true
@ -48,4 +47,5 @@ cfg-if = "1.0.0"
[dev-dependencies]
async-std = "1.13.0"
tracing-test = "0.2.5"
tracing-tracy = "0.11.4"
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) {
if let Some((_, heartbeat)) = self.heartbeats.iter_mut().nth(n) {
heartbeat.set();

View file

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

View file

@ -4,10 +4,10 @@ use executor::util::tree::Tree;
const TREE_SIZE: usize = 16;
fn join_scope() {
fn join_scope(tree_size: usize) {
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 {
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 tree = Tree::new(TREE_SIZE, 1);
let tree = Tree::new(tree_size, 1);
fn sum(tree: &Tree<u32>, node: usize, pool: &ThreadPool) -> u32 {
let node = tree.get(node);
@ -60,10 +60,10 @@ fn join_pool() {
eprintln!("sum: {sum}");
}
fn join_distaff() {
fn join_distaff(tree_size: usize) {
use distaff::*;
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 {
let node = tree.get(node);
@ -81,17 +81,15 @@ fn join_distaff() {
node.leaf + l + r
}
for _ in 0..1000 {
let sum = pool.scope(|s| {
let sum = sum(&tree, tree.root().unwrap(), s);
sum
});
std::hint::black_box(sum);
}
let sum = pool.scope(|s| {
let sum = sum(&tree, tree.root().unwrap(), s);
sum
});
std::hint::black_box(sum);
}
fn join_chili() {
let tree = Tree::new(TREE_SIZE, 1u32);
fn join_chili(tree_size: usize) {
let tree = Tree::new(tree_size, 1u32);
fn sum(tree: &Tree<u32>, node: usize, scope: &mut chili::Scope<'_>) -> u32 {
let node = tree.get(node);
@ -113,8 +111,8 @@ fn join_chili() {
}
}
fn join_rayon() {
let tree = Tree::new(TREE_SIZE, 1u32);
fn join_rayon(tree_size: usize) {
let tree = Tree::new(tree_size, 1u32);
fn sum(tree: &Tree<u32>, node: usize) -> u32 {
let node = tree.get(node);
@ -133,19 +131,34 @@ fn join_rayon() {
}
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() {
Some("scope") => join_scope(),
Some("pool") => join_pool(),
Some("chili") => join_chili(),
Some("distaff") => join_distaff(),
Some("rayon") => join_rayon(),
Some("scope") => join_scope(size),
Some("pool") => join_pool(size),
Some("chili") => join_chili(size),
Some("distaff") => join_distaff(size),
Some("rayon") => join_rayon(size),
_ => {
eprintln!(
"Usage: {} [scope|pool|chili|distaff|rayon]",
std::env::args().next().unwrap()
"Usage: {} [scope|pool|chili|distaff|rayon] <tree_size={}>",
std::env::args().next().unwrap(),
TREE_SIZE
);
return;
}
}
eprintln!("Done!");
// wait for user input before exiting
// std::io::stdin().read_line(&mut String::new()).unwrap();
}