use lamellar::array::prelude::*;
use lamellar::memregion::prelude::*;
async fn initialize_array(array: &UnsafeArray<usize>) {
unsafe { array.dist_iter_mut().for_each(|x| *x = 0).await };
}
fn initialize_mem_region<M: Into<LamellarMemoryRegion<usize>> + Clone>(memregion: &M) {
let memregion: LamellarMemoryRegion<usize> = memregion.clone().into();
unsafe {
let mut i = 0; for elem in memregion.as_mut_slice() {
*elem = i;
i += 1
}
}
}
#[lamellar::main]
fn main() {
let args: Vec<String> = std::env::args().collect();
let world = lamellar::LamellarWorldBuilder::new().build();
world.clone().block_on(async move {
let _num_pes = world.num_pes();
let my_pe = world.my_pe();
let total_len = args
.get(1)
.and_then(|s| s.parse::<usize>().ok())
.unwrap_or_else(|| 100);
let block_array =
UnsafeArray::<usize>::new(world.team(), total_len, Distribution::Block).await;
let cyclic_array =
UnsafeArray::<usize>::new(world.team(), total_len, Distribution::Cyclic).await;
let shared_mem_region = world.alloc_shared_mem_region(total_len).await;
let local_mem_region = world.alloc_one_sided_mem_region(total_len);
initialize_array(&block_array).await;
world.async_barrier().await;
initialize_array(&cyclic_array).await;
world.async_barrier().await;
initialize_mem_region(&shared_mem_region);
initialize_mem_region(&local_mem_region);
println!("data initialized");
world.async_barrier().await;
unsafe {
block_array.print();
world.async_barrier().await;
println!("PE{my_pe}, smr {:?}", shared_mem_region.as_slice());
world.async_barrier().await;
let start = std::time::Instant::now();
if my_pe == 0 {
block_array.put_buffer(0, &shared_mem_region).await
}; world.async_barrier().await;
block_array.print();
world.async_barrier().await;
println!("PE{my_pe}, smr {:?}", shared_mem_region.as_slice());
world.async_barrier().await;
println!("PE{my_pe}, lmr {:?}", local_mem_region.as_slice());
world.async_barrier().await;
if my_pe == 0 {
block_array.put_buffer(0, &local_mem_region).await
};
world.async_barrier().await;
block_array.print();
println!("PE{my_pe}, lmr {:?}", local_mem_region.as_slice());
world.async_barrier().await;
cyclic_array.print();
world.async_barrier().await;
if my_pe == 0 {
cyclic_array.put_buffer(0, &shared_mem_region).await
};
world.async_barrier().await;
cyclic_array.print();
world.async_barrier().await;
println!("PE{my_pe}, smr {:?}", shared_mem_region.as_slice());
world.async_barrier().await;
println!("PE{my_pe}, lmr {:?}", local_mem_region.as_slice());
world.async_barrier().await;
if my_pe == 0 {
cyclic_array.put_buffer(0, &local_mem_region).await
};
world.async_barrier().await;
cyclic_array.print();
println!("put elapsed {:?}", start.elapsed().as_secs_f64());
world.async_barrier().await;
initialize_array(&block_array).await;
initialize_array(&cyclic_array).await;
block_array.print();
world.async_barrier().await;
println!("PE{my_pe}, smr {:?}", shared_mem_region.as_slice());
world.async_barrier().await;
let start = std::time::Instant::now();
block_array.print();
world.async_barrier().await;
println!("PE{my_pe}, smr {:?}", shared_mem_region.as_slice());
world.async_barrier().await;
if my_pe == 0 {
let mut buffer =
LamellarBuffer::<usize, SharedMemoryRegion<usize>>::from_shared_memory_region(
shared_mem_region.sub_region(0..total_len / 2),
);
println!("PE{my_pe}, get buffer slice {:?} buffer", buffer.as_mut_slice());
block_array.get_into_buffer(0, buffer).await;
} println!("PE{my_pe}, lmr {:?}", local_mem_region.as_slice());
world.async_barrier().await;
if my_pe == 0 {
let buffer =
LamellarBuffer::<usize, OneSidedMemoryRegion<usize>>::from_one_sided_memory_region(
local_mem_region.sub_region(0..total_len / 2),
);
block_array.get_into_buffer(0, buffer).await;
}
world.async_barrier().await;
block_array.print();
println!("PE{my_pe}, lmr {:?}", local_mem_region.as_slice());
world.async_barrier().await;
println!("get_unchecked elapsed {:?}", start.elapsed().as_secs_f64());
}
let start = std::time::Instant::now();
unsafe {
let buffer = LamellarBuffer::<usize, SharedMemoryRegion<usize>>::from_shared_memory_region(
shared_mem_region.sub_region(0..total_len / 2),
);
cyclic_array.get_into_buffer(0, buffer).await;
let buffer = LamellarBuffer::<usize, OneSidedMemoryRegion<usize>>::from_one_sided_memory_region(
local_mem_region.sub_region(0..total_len / 2),
);
cyclic_array.get_into_buffer(0, buffer).await;
}
println!("get elapsed {:?}", start.elapsed().as_secs_f64());
world.async_barrier().await;
unsafe {
block_array.put(total_len - 1, 12345).await;
cyclic_array.put(total_len - 1, 12345).await;
}
world.async_barrier().await;
});
}