use lamellar::active_messaging::prelude::*;
use lamellar::array::prelude::*;
use rand::{distr::Distribution, rngs::StdRng, SeedableRng};
use std::time::Instant;
use tracing_subscriber::fmt;
const ARRAY_SIZE: usize = 100000000;
const NUM_UPDATES_PER_PE: usize = 1000000;
#[lamellar::main]
fn main() {
let _subscriber = fmt::init();
let world = lamellar::LamellarWorldBuilder::new().build();
let array =
AtomicArray::<usize>::new(&world, ARRAY_SIZE, lamellar::Distribution::Block).block();
let mut rng: StdRng = SeedableRng::seed_from_u64(world.my_pe() as u64);
let range = rand::distr::Uniform::new(0, ARRAY_SIZE).unwrap();
array.barrier();
let start = Instant::now();
let histo = array.batch_add(
&mut range.sample_iter(&mut rng).take(NUM_UPDATES_PER_PE)
as &mut dyn Iterator<Item = usize>,
1,
);
histo.block();
world.wait_all();
world.barrier();
if world.my_pe() == 0 {
println!(
"PE{} time: {:?} done",
world.my_pe(),
start.elapsed().as_secs_f64()
);
let sum_time = Instant::now();
let sum = array.sum().block().expect("array len > 0");
println!(
"PE{} sum: {} time: {:?}",
world.my_pe(),
sum,
sum_time.elapsed().as_secs_f64()
);
}
}