#![no_std]
#![no_main]
use et_abi::{DeviceArgs, ReduceArgs};
use et_kernel::{Grid, MsgBuf, device_slice, kernel_entry, trace_str};
kernel_entry!();
#[unsafe(no_mangle)]
pub extern "C" fn entry_point(args_ptr: usize) -> i64 {
let args = unsafe { ReduceArgs::from_ptr(args_ptr as *const u8) };
let grid = Grid::new(args.n_harts);
if !grid.active() {
return 0;
}
let input: &[u32] = unsafe { device_slice(args.input as usize, args.n as usize) };
let cell: &mut u64 = unsafe { grid.output_cell(args.out as usize) };
let partial: u64 = grid.my_slice(input).iter().map(|&x| x as u64).sum();
*cell = partial;
if grid.hart() == 0 {
let mut m = MsgBuf::new();
m.str(b"reduce: n=")
.u64(args.n as u64)
.str(b" harts=")
.u64(args.n_harts as u64)
.str(b" hart0_partial=")
.u64(partial);
trace_str(m.as_slice());
}
0
}
#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
loop {
core::hint::spin_loop();
}
}