From 4285189e17544c49258e683a2dc244e9b275dc65 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sun, 25 Feb 2024 23:04:56 +0100 Subject: [PATCH] Introduce workload markings --- pim-os/src/bin/classic_gemv.rs | 8 +- pim-os/src/bin/classic_gemv_layers.rs | 8 +- pim-os/src/bin/classic_haxpy.rs | 10 +-- pim-os/src/bin/classic_vadd.rs | 8 +- pim-os/src/bin/classic_vmul.rs | 8 +- pim-os/src/bin/gemv.rs | 2 + pim-os/src/bin/gemv_layers.rs | 48 +++++------ pim-os/src/bin/haxpy.rs | 12 +-- pim-os/src/bin/vadd.rs | 2 + pim-os/src/bin/vmul.rs | 2 + pim-os/src/kernel/haxpy.rs | 120 +++++++++++++------------- pim-os/src/lib.rs | 2 +- pim-os/src/m5op.rs | 24 +++--- 13 files changed, 130 insertions(+), 124 deletions(-) diff --git a/pim-os/src/bin/classic_gemv.rs b/pim-os/src/bin/classic_gemv.rs index 8d04bce..f0ca28a 100644 --- a/pim-os/src/bin/classic_gemv.rs +++ b/pim-os/src/bin/classic_gemv.rs @@ -26,10 +26,10 @@ pub extern "C" fn main() { let matrix = SMatrix::::zeros(); let input_vector = SVector::::zeros(); - for _ in 0..10 { - let output_vector = matrix * input_vector; - core::hint::black_box(output_vector); - } + pim_os::m5op::exit(0); + let output_vector = matrix * input_vector; + core::hint::black_box(output_vector); + pim_os::m5op::exit(0); writeln!(Uart0, "Done").unwrap(); } diff --git a/pim-os/src/bin/classic_gemv_layers.rs b/pim-os/src/bin/classic_gemv_layers.rs index d587be4..a9d1fac 100644 --- a/pim-os/src/bin/classic_gemv_layers.rs +++ b/pim-os/src/bin/classic_gemv_layers.rs @@ -15,10 +15,10 @@ pub extern "C" fn main() { let matrix = SMatrix::::zeros(); let mut input_vector = SVector::::zeros(); - for _ in 0..5 { - input_vector = matrix * input_vector; - core::hint::black_box(input_vector); - } + pim_os::m5op::exit(0); + input_vector = matrix * input_vector; + core::hint::black_box(input_vector); + pim_os::m5op::exit(0); writeln!(Uart0, "Done").unwrap(); } diff --git a/pim-os/src/bin/classic_haxpy.rs b/pim-os/src/bin/classic_haxpy.rs index 68fb990..8fc2b5e 100644 --- a/pim-os/src/bin/classic_haxpy.rs +++ b/pim-os/src/bin/classic_haxpy.rs @@ -26,11 +26,11 @@ pub extern "C" fn main() { let b = SVector::::zeros(); let s = F16x1::zero(); - for _ in 0..10 { - let a_s = a * s; - let c = a_s.component_mul(&b); - core::hint::black_box(c); - } + pim_os::m5op::exit(0); + let a_s = a * s; + let c = a_s.component_mul(&b); + core::hint::black_box(c); + pim_os::m5op::exit(0); writeln!(Uart0, "Done").unwrap(); } diff --git a/pim-os/src/bin/classic_vadd.rs b/pim-os/src/bin/classic_vadd.rs index 07ed84a..5cad6a1 100644 --- a/pim-os/src/bin/classic_vadd.rs +++ b/pim-os/src/bin/classic_vadd.rs @@ -24,10 +24,10 @@ pub extern "C" fn main() { let a = SVector::::zeros(); let b = SVector::::zeros(); - for _ in 0..10 { - let c = a + b; - core::hint::black_box(c); - } + pim_os::m5op::exit(0); + let c = a + b; + core::hint::black_box(c); + pim_os::m5op::exit(0); writeln!(Uart0, "Done").unwrap(); } diff --git a/pim-os/src/bin/classic_vmul.rs b/pim-os/src/bin/classic_vmul.rs index 4bd7def..46b0a6b 100644 --- a/pim-os/src/bin/classic_vmul.rs +++ b/pim-os/src/bin/classic_vmul.rs @@ -24,10 +24,10 @@ pub extern "C" fn main() { let a = SVector::::zeros(); let b = SVector::::zeros(); - for _ in 0..10 { - let c = a.component_mul(&b); - core::hint::black_box(c); - } + pim_os::m5op::exit(0); + let c = a.component_mul(&b); + core::hint::black_box(c); + pim_os::m5op::exit(0); writeln!(Uart0, "Done").unwrap(); } diff --git a/pim-os/src/bin/gemv.rs b/pim-os/src/bin/gemv.rs index 4938071..3617853 100644 --- a/pim-os/src/bin/gemv.rs +++ b/pim-os/src/bin/gemv.rs @@ -67,12 +67,14 @@ pub extern "C" fn main() { { pim::state::set_bank_mode(BankMode::PimAllBank); + pim_os::m5op::exit(0); gemv::execute( pim_matrix.as_ref(), interleaved_input_vector.as_ref(), output_partial_sum_vector.as_mut(), dummy.as_ref(), ); + pim_os::m5op::exit(0); pim::state::set_bank_mode(BankMode::SingleBank); } diff --git a/pim-os/src/bin/gemv_layers.rs b/pim-os/src/bin/gemv_layers.rs index 10960e6..dd2cf61 100644 --- a/pim-os/src/bin/gemv_layers.rs +++ b/pim-os/src/bin/gemv_layers.rs @@ -38,35 +38,33 @@ pub extern "C" fn main() { let dummy = Box::new(0); - for _ in 0..5 { - let interleaved_input_vector = - Box::new(interleaved_array::Vector::from(input_vector.clone())); + let interleaved_input_vector = Box::new(interleaved_array::Vector::from(input_vector.clone())); - // Verify everything is correctly initialized before PIM operation - barrier::dsb(barrier::SY); + // Verify everything is correctly initialized before PIM operation + barrier::dsb(barrier::SY); - // Execute kernel - { - pim::state::set_bank_mode(BankMode::PimAllBank); + // Execute kernel + { + pim::state::set_bank_mode(BankMode::PimAllBank); - gemv::execute( - pim_matrix.as_ref(), - interleaved_input_vector.as_ref(), - output_partial_sum_vector.as_mut(), - dummy.as_ref(), - ); + gemv::execute( + pim_matrix.as_ref(), + interleaved_input_vector.as_ref(), + output_partial_sum_vector.as_mut(), + dummy.as_ref(), + ); - pim::state::set_bank_mode(BankMode::SingleBank); - } - - let output_vector = SVector::::from_fn(|r, _| { - output_partial_sum_vector[r] - .0 - .iter() - .fold(F16x1::zero(), |acc, val| acc + *val) - }); - - core::hint::black_box(output_vector); + pim::state::set_bank_mode(BankMode::SingleBank); } + + let output_vector = SVector::::from_fn(|r, _| { + output_partial_sum_vector[r] + .0 + .iter() + .fold(F16x1::zero(), |acc, val| acc + *val) + }); + + core::hint::black_box(output_vector); + writeln!(Uart0, "Done").unwrap(); } diff --git a/pim-os/src/bin/haxpy.rs b/pim-os/src/bin/haxpy.rs index 0e21ba2..6e7b9a6 100644 --- a/pim-os/src/bin/haxpy.rs +++ b/pim-os/src/bin/haxpy.rs @@ -19,17 +19,17 @@ use pim_os::{ }; #[cfg(feature = "X1")] -const ROWS: usize = 128; - -#[cfg(feature = "X2")] const ROWS: usize = 256; -#[cfg(feature = "X3")] +#[cfg(feature = "X2")] const ROWS: usize = 512; -#[cfg(feature = "X4")] +#[cfg(feature = "X3")] const ROWS: usize = 1024; +#[cfg(feature = "X4")] +const ROWS: usize = 2048; + const ELEMENTS_PER_BANK: usize = 16; const BANKS: usize = 16; const BLOCKS: usize = ROWS / (ELEMENTS_PER_BANK * BANKS); @@ -73,6 +73,7 @@ pub extern "C" fn main() { { pim::state::set_bank_mode(BankMode::PimAllBank); + pim_os::m5op::exit(0); haxpy::execute::( &a.0, &b.0, @@ -80,6 +81,7 @@ pub extern "C" fn main() { &mut c.0, dummy.as_ref(), ); + pim_os::m5op::exit(0); pim::state::set_bank_mode(BankMode::SingleBank); } diff --git a/pim-os/src/bin/vadd.rs b/pim-os/src/bin/vadd.rs index 5e15dd0..a38ecd6 100644 --- a/pim-os/src/bin/vadd.rs +++ b/pim-os/src/bin/vadd.rs @@ -67,7 +67,9 @@ pub extern "C" fn main() { { pim::state::set_bank_mode(BankMode::PimAllBank); + pim_os::m5op::exit(0); vadd::execute::(&a.0, &b.0, &mut c.0, dummy.as_ref()); + pim_os::m5op::exit(0); pim::state::set_bank_mode(BankMode::SingleBank); } diff --git a/pim-os/src/bin/vmul.rs b/pim-os/src/bin/vmul.rs index 9d3ab84..b667b94 100644 --- a/pim-os/src/bin/vmul.rs +++ b/pim-os/src/bin/vmul.rs @@ -67,7 +67,9 @@ pub extern "C" fn main() { { pim::state::set_bank_mode(BankMode::PimAllBank); + pim_os::m5op::exit(0); vmul::execute::(&a.0, &b.0, &mut c.0, dummy.as_ref()); + pim_os::m5op::exit(0); pim::state::set_bank_mode(BankMode::SingleBank); } diff --git a/pim-os/src/kernel/haxpy.rs b/pim-os/src/kernel/haxpy.rs index 158c9f3..6a756a8 100644 --- a/pim-os/src/kernel/haxpy.rs +++ b/pim-os/src/kernel/haxpy.rs @@ -13,13 +13,13 @@ pub const KERNEL_X1: Kernel = Kernel([ }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 0 }, - src2: File::SrfA { index: 0 }, - dst: File::GrfB { index: 0 }, + src1: File::SrfA { index: 0 }, + src2: File::GrfA { index: 0 }, + dst: File::GrfA { index: 0 }, aam: false, }, Instruction::FILL { - src: File::GrfB { index: 0 }, + src: File::GrfA { index: 0 }, dst: File::Bank, }, Instruction::EXIT, @@ -67,24 +67,24 @@ pub const KERNEL_X2: Kernel = Kernel([ }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 0 }, - src2: File::SrfA { index: 0 }, - dst: File::GrfB { index: 0 }, + src1: File::SrfA { index: 0 }, + src2: File::GrfA { index: 0 }, + dst: File::GrfA { index: 0 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 1 }, - src2: File::SrfA { index: 1 }, - dst: File::GrfB { index: 1 }, + src1: File::SrfA { index: 1 }, + src2: File::GrfA { index: 1 }, + dst: File::GrfA { index: 1 }, aam: false, }, Instruction::FILL { - src: File::GrfB { index: 0 }, + src: File::GrfA { index: 0 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 1 }, + src: File::GrfA { index: 1 }, dst: File::Bank, }, Instruction::EXIT, @@ -137,46 +137,46 @@ pub const KERNEL_X3: Kernel = Kernel([ }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 0 }, - src2: File::SrfA { index: 0 }, - dst: File::GrfB { index: 0 }, + src1: File::SrfA { index: 0 }, + src2: File::GrfA { index: 0 }, + dst: File::GrfA { index: 0 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 1 }, - src2: File::SrfA { index: 1 }, - dst: File::GrfB { index: 1 }, + src1: File::SrfA { index: 1 }, + src2: File::GrfA { index: 1 }, + dst: File::GrfA { index: 1 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 2 }, - src2: File::SrfA { index: 2 }, - dst: File::GrfB { index: 2 }, + src1: File::SrfA { index: 2 }, + src2: File::GrfA { index: 2 }, + dst: File::GrfA { index: 2 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 3 }, - src2: File::SrfA { index: 3 }, - dst: File::GrfB { index: 3 }, + src1: File::SrfA { index: 3 }, + src2: File::GrfA { index: 3 }, + dst: File::GrfA { index: 3 }, aam: false, }, Instruction::FILL { - src: File::GrfB { index: 0 }, + src: File::GrfA { index: 0 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 1 }, + src: File::GrfA { index: 1 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 2 }, + src: File::GrfA { index: 2 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 3 }, + src: File::GrfA { index: 3 }, dst: File::Bank, }, Instruction::EXIT, @@ -239,90 +239,90 @@ pub const KERNEL_X4: Kernel = Kernel([ }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 0 }, - src2: File::SrfA { index: 0 }, - dst: File::GrfB { index: 0 }, + src1: File::SrfA { index: 0 }, + src2: File::GrfA { index: 0 }, + dst: File::GrfA { index: 0 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 1 }, - src2: File::SrfA { index: 1 }, - dst: File::GrfB { index: 1 }, + src1: File::SrfA { index: 1 }, + src2: File::GrfA { index: 1 }, + dst: File::GrfA { index: 1 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 2 }, - src2: File::SrfA { index: 2 }, - dst: File::GrfB { index: 2 }, + src1: File::SrfA { index: 2 }, + src2: File::GrfA { index: 2 }, + dst: File::GrfA { index: 2 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 3 }, - src2: File::SrfA { index: 3 }, - dst: File::GrfB { index: 3 }, + src1: File::SrfA { index: 3 }, + src2: File::GrfA { index: 3 }, + dst: File::GrfA { index: 3 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 4 }, - src2: File::SrfA { index: 4 }, - dst: File::GrfB { index: 4 }, + src1: File::SrfA { index: 4 }, + src2: File::GrfA { index: 4 }, + dst: File::GrfA { index: 4 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 5 }, - src2: File::SrfA { index: 5 }, - dst: File::GrfB { index: 5 }, + src1: File::SrfA { index: 5 }, + src2: File::GrfA { index: 5 }, + dst: File::GrfA { index: 5 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 6 }, - src2: File::SrfA { index: 6 }, - dst: File::GrfB { index: 6 }, + src1: File::SrfA { index: 6 }, + src2: File::GrfA { index: 6 }, + dst: File::GrfA { index: 6 }, aam: false, }, Instruction::MAD { src0: File::Bank, - src1: File::GrfA { index: 7 }, - src2: File::SrfA { index: 7 }, - dst: File::GrfB { index: 7 }, + src1: File::SrfA { index: 7 }, + src2: File::GrfA { index: 7 }, + dst: File::GrfA { index: 7 }, aam: false, }, Instruction::FILL { - src: File::GrfB { index: 0 }, + src: File::GrfA { index: 0 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 1 }, + src: File::GrfA { index: 1 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 2 }, + src: File::GrfA { index: 2 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 3 }, + src: File::GrfA { index: 3 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 4 }, + src: File::GrfA { index: 4 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 5 }, + src: File::GrfA { index: 5 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 6 }, + src: File::GrfA { index: 6 }, dst: File::Bank, }, Instruction::FILL { - src: File::GrfB { index: 7 }, + src: File::GrfA { index: 7 }, dst: File::Bank, }, Instruction::EXIT, diff --git a/pim-os/src/lib.rs b/pim-os/src/lib.rs index 2c96e80..7b4447b 100644 --- a/pim-os/src/lib.rs +++ b/pim-os/src/lib.rs @@ -24,7 +24,7 @@ pub extern "C" fn entry() -> ! { unsafe { main() } - m5op::exit(); + m5op::exit(0); loop { compiler_fence(Ordering::SeqCst); diff --git a/pim-os/src/m5op.rs b/pim-os/src/m5op.rs index b9a8a1c..49e235f 100644 --- a/pim-os/src/m5op.rs +++ b/pim-os/src/m5op.rs @@ -3,24 +3,24 @@ use core::arch::global_asm; global_asm!(include_str!("m5op.s")); extern "C" { - fn m5_exit(); - fn m5_reset_stats(); - fn m5_dump_stats(); - fn m5_dump_reset_stats(); + fn m5_exit(delay_ns: u64); + fn m5_reset_stats(delay_ns: u64, period_ns: u64); + fn m5_dump_stats(delay_ns: u64, period_ns: u64); + fn m5_dump_reset_stats(delay_ns: u64, period_ns: u64); } -pub fn exit() { - unsafe { m5_exit() } +pub fn exit(delay_ns: u64) { + unsafe { m5_exit(delay_ns) } } -pub fn reset_stats() { - unsafe { m5_reset_stats() } +pub fn reset_stats(delay_ns: u64, period_ns: u64) { + unsafe { m5_reset_stats(delay_ns, period_ns) } } -pub fn dump_stats() { - unsafe { m5_dump_stats() } +pub fn dump_stats(delay_ns: u64, period_ns: u64) { + unsafe { m5_dump_stats(delay_ns, period_ns) } } -pub fn dump_reset_stats() { - unsafe { m5_dump_reset_stats() } +pub fn dump_reset_stats(delay_ns: u64, period_ns: u64) { + unsafe { m5_dump_reset_stats(delay_ns, period_ns) } }