From 1363f20cfc6aef1dcb0dbe8d7ee58ac4b74dab45 Mon Sep 17 00:00:00 2001 From: Janis Date: Tue, 24 Jun 2025 19:13:47 +0200 Subject: [PATCH] join example executable --- examples/join.rs | 151 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 examples/join.rs diff --git a/examples/join.rs b/examples/join.rs new file mode 100644 index 0000000..9a2c31b --- /dev/null +++ b/examples/join.rs @@ -0,0 +1,151 @@ +use executor::praetor::{Scope, ThreadPool}; + +use executor::util::tree::Tree; + +const TREE_SIZE: usize = 16; + +fn join_scope() { + let pool = ThreadPool::new(); + + let tree = Tree::new(TREE_SIZE, 1); + + fn sum(tree: &Tree, node: usize, scope: &Scope) -> u32 { + let node = tree.get(node); + let (l, r) = scope.join( + |s| node.left.map(|node| sum(tree, node, s)).unwrap_or_default(), + |s| { + node.right + .map(|node| sum(tree, node, s)) + .unwrap_or_default() + }, + ); + + // eprintln!("node: {node:?}, l: {l}, r: {r}"); + + node.leaf + l + r + } + + for _ in 0..1000 { + let sum = pool.scope(|s| sum(&tree, tree.root().unwrap(), s)); + std::hint::black_box(sum); + } +} + +fn join_pool() { + let pool = ThreadPool::new(); + + let tree = Tree::new(TREE_SIZE, 1); + + fn sum(tree: &Tree, node: usize, pool: &ThreadPool) -> u32 { + let node = tree.get(node); + let (l, r) = pool.join( + || { + node.left + .map(|node| sum(tree, node, pool)) + .unwrap_or_default() + }, + || { + node.right + .map(|node| sum(tree, node, pool)) + .unwrap_or_default() + }, + ); + + // eprintln!("node: {node:?}, l: {l}, r: {r}"); + + node.leaf + l + r + } + + let sum = sum(&tree, tree.root().unwrap(), &pool); + eprintln!("sum: {sum}"); +} + +fn join_distaff() { + use distaff::*; + let pool = ThreadPool::new(); + let tree = Tree::new(TREE_SIZE, 1); + + fn sum<'scope, 'env>(tree: &Tree, node: usize, scope: &'scope Scope<'scope, 'env>) -> u32 { + let node = tree.get(node); + let (l, r) = scope.join( + |s| node.left.map(|node| sum(tree, node, s)).unwrap_or_default(), + |s| { + node.right + .map(|node| sum(tree, node, s)) + .unwrap_or_default() + }, + ); + + // eprintln!("node: {node:?}, l: {l}, r: {r}"); + + 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); + } +} + +fn join_chili() { + let tree = Tree::new(TREE_SIZE, 1u32); + + fn sum(tree: &Tree, node: usize, scope: &mut chili::Scope<'_>) -> u32 { + let node = tree.get(node); + let (l, r) = scope.join( + |s| node.left.map(|node| sum(tree, node, s)).unwrap_or_default(), + |s| { + node.right + .map(|node| sum(tree, node, s)) + .unwrap_or_default() + }, + ); + + node.leaf + l + r + } + + for _ in 0..1000 { + sum(&tree, tree.root().unwrap(), &mut chili::Scope::global()); + std::hint::black_box(sum); + } +} + +fn join_rayon() { + let tree = Tree::new(TREE_SIZE, 1u32); + + fn sum(tree: &Tree, node: usize) -> u32 { + let node = tree.get(node); + let (l, r) = rayon::join( + || node.left.map(|node| sum(tree, node)).unwrap_or_default(), + || node.right.map(|node| sum(tree, node)).unwrap_or_default(), + ); + + node.leaf + l + r + } + + for _ in 0..1000 { + let sum = sum(&tree, tree.root().unwrap()); + std::hint::black_box(sum); + } +} + +fn main() { + tracing_subscriber::fmt::init(); + 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(), + _ => { + eprintln!( + "Usage: {} [scope|pool|chili|distaff|rayon]", + std::env::args().next().unwrap() + ); + return; + } + } +}