diff --git a/pim-os/src/bin/classic_matrix_matrix_multiply.rs b/pim-os/src/bin/classic/matrix_matrix_multiply.rs similarity index 100% rename from pim-os/src/bin/classic_matrix_matrix_multiply.rs rename to pim-os/src/bin/classic/matrix_matrix_multiply.rs diff --git a/pim-os/src/bin/samsung_matrix_vector_multiply.rs b/pim-os/src/bin/gemv.rs similarity index 91% rename from pim-os/src/bin/samsung_matrix_vector_multiply.rs rename to pim-os/src/bin/gemv.rs index c8ddb41..766b4a0 100644 --- a/pim-os/src/bin/samsung_matrix_vector_multiply.rs +++ b/pim-os/src/bin/gemv.rs @@ -10,9 +10,9 @@ use nalgebra::{SMatrix, SVector}; use num_traits::{One, Zero}; use pim_isa::BankMode; use pim_os::{ + kernel::gemv, pim::{ self, interleaved_array, - kernel::samsung_matrix_vector_mul, vector::{F16x1, F16x16}, }, uart::Uart0, @@ -25,7 +25,7 @@ const X16_COLUMNS: usize = COLUMNS / 16; #[no_mangle] pub extern "C" fn main() { - pim::state::set_kernel(&samsung_matrix_vector_mul::KERNEL); + pim::state::set_kernel(&gemv::KERNEL); let mut matrix = SMatrix::<_, ROWS, COLUMNS>::zeros(); matrix.fill_lower_triangle(F16x1::one(), 0); @@ -46,7 +46,7 @@ pub extern "C" fn main() { { pim::state::set_bank_mode(BankMode::PimAllBank); - samsung_matrix_vector_mul::execute( + gemv::execute( pim_matrix.as_ref(), interleaved_input_vector.as_ref(), output_partial_sum_vector.as_mut(), diff --git a/pim-os/src/bin/matrix_matrix_add.rs b/pim-os/src/bin/legacy/matrix_matrix_add.rs similarity index 100% rename from pim-os/src/bin/matrix_matrix_add.rs rename to pim-os/src/bin/legacy/matrix_matrix_add.rs diff --git a/pim-os/src/bin/matrix_matrix_multiply.rs b/pim-os/src/bin/legacy/matrix_matrix_multiply.rs similarity index 100% rename from pim-os/src/bin/matrix_matrix_multiply.rs rename to pim-os/src/bin/legacy/matrix_matrix_multiply.rs diff --git a/pim-os/src/bin/matrix_scalar_multiply.rs b/pim-os/src/bin/legacy/matrix_scalar_multiply.rs similarity index 100% rename from pim-os/src/bin/matrix_scalar_multiply.rs rename to pim-os/src/bin/legacy/matrix_scalar_multiply.rs diff --git a/pim-os/src/bin/matrix_vector_multiply.rs b/pim-os/src/bin/legacy/matrix_vector_multiply.rs similarity index 100% rename from pim-os/src/bin/matrix_vector_multiply.rs rename to pim-os/src/bin/legacy/matrix_vector_multiply.rs diff --git a/pim-os/src/bin/vadd.rs b/pim-os/src/bin/vadd.rs new file mode 100644 index 0000000..766b4a0 --- /dev/null +++ b/pim-os/src/bin/vadd.rs @@ -0,0 +1,69 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +use aarch64_cpu::asm::barrier; +use alloc::boxed::Box; +use core::fmt::Write; +use nalgebra::{SMatrix, SVector}; +use num_traits::{One, Zero}; +use pim_isa::BankMode; +use pim_os::{ + kernel::gemv, + pim::{ + self, interleaved_array, + vector::{F16x1, F16x16}, + }, + uart::Uart0, +}; + +const ROWS: usize = 32; +const COLUMNS: usize = 128; +const X16_ROWS: usize = ROWS / 16; +const X16_COLUMNS: usize = COLUMNS / 16; + +#[no_mangle] +pub extern "C" fn main() { + pim::state::set_kernel(&gemv::KERNEL); + + let mut matrix = SMatrix::<_, ROWS, COLUMNS>::zeros(); + matrix.fill_lower_triangle(F16x1::one(), 0); + + let pim_matrix = Box::new(pim::continuous_array::Matrix::::from(matrix)); + + let input_vector = SVector::<_, X16_COLUMNS>::from_element(F16x16::one()); + let interleaved_input_vector = Box::new(interleaved_array::Vector::from(input_vector)); + + let mut output_partial_sum_vector = Box::new(SVector::::zeros()); + + let dummy = Box::new(0); + + // Verify everything is correctly initialized before PIM operation + barrier::dsb(barrier::SY); + + // 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(), + ); + + pim::state::set_bank_mode(BankMode::SingleBank); + } + + writeln!(Uart0, "{output_partial_sum_vector}").unwrap(); + + let output_vector = SVector::::from_fn(|r, _| { + output_partial_sum_vector[r] + .0 + .iter() + .fold(F16x1::zero(), |acc, val| acc + *val) + }); + + writeln!(Uart0, "{output_vector}").unwrap(); +} diff --git a/pim-os/src/kernel.rs b/pim-os/src/kernel.rs new file mode 100644 index 0000000..5cedcb1 --- /dev/null +++ b/pim-os/src/kernel.rs @@ -0,0 +1,2 @@ +pub mod legacy; +pub mod gemv; diff --git a/pim-os/src/pim/kernel/samsung_matrix_vector_mul.rs b/pim-os/src/kernel/gemv.rs similarity index 100% rename from pim-os/src/pim/kernel/samsung_matrix_vector_mul.rs rename to pim-os/src/kernel/gemv.rs diff --git a/pim-os/src/kernel/legacy.rs b/pim-os/src/kernel/legacy.rs new file mode 100644 index 0000000..2bde5ff --- /dev/null +++ b/pim-os/src/kernel/legacy.rs @@ -0,0 +1,3 @@ +pub mod matrix_matrix_mul; +pub mod matrix_scalar_mul; +pub mod matrix_vector_mul; \ No newline at end of file diff --git a/pim-os/src/pim/kernel/matrix_matrix_add.rs b/pim-os/src/kernel/legacy/matrix_matrix_add.rs similarity index 98% rename from pim-os/src/pim/kernel/matrix_matrix_add.rs rename to pim-os/src/kernel/legacy/matrix_matrix_add.rs index de2a9a6..54300ae 100644 --- a/pim-os/src/pim/kernel/matrix_matrix_add.rs +++ b/pim-os/src/kernel/legacy/matrix_matrix_add.rs @@ -1,4 +1,4 @@ -use crate::pim::array::{DummyArray, PimMatrixArena, PimRegion}; +use crate::pim::legacy::array::{DummyArray, PimMatrixArena, PimRegion}; use pim_isa::{File, Instruction, Kernel}; pub const KERNEL: Kernel = Kernel([ diff --git a/pim-os/src/pim/kernel/matrix_matrix_mul.rs b/pim-os/src/kernel/legacy/matrix_matrix_mul.rs similarity index 98% rename from pim-os/src/pim/kernel/matrix_matrix_mul.rs rename to pim-os/src/kernel/legacy/matrix_matrix_mul.rs index 7db8067..513fede 100644 --- a/pim-os/src/pim/kernel/matrix_matrix_mul.rs +++ b/pim-os/src/kernel/legacy/matrix_matrix_mul.rs @@ -1,4 +1,4 @@ -use crate::pim::array::{DummyArray, PimMatrixArena, PimRegion}; +use crate::pim::legacy::array::{DummyArray, PimMatrixArena, PimRegion}; use pim_isa::{File, Instruction, Kernel}; pub const KERNEL: Kernel = Kernel([ diff --git a/pim-os/src/pim/kernel/matrix_scalar_mul.rs b/pim-os/src/kernel/legacy/matrix_scalar_mul.rs similarity index 97% rename from pim-os/src/pim/kernel/matrix_scalar_mul.rs rename to pim-os/src/kernel/legacy/matrix_scalar_mul.rs index eab0b1e..1f2f3ea 100644 --- a/pim-os/src/pim/kernel/matrix_scalar_mul.rs +++ b/pim-os/src/kernel/legacy/matrix_scalar_mul.rs @@ -1,4 +1,4 @@ -use crate::pim::array::{DummyArray, PimMatrixArena, PimRegion, PimScalarArena}; +use crate::pim::legacy::array::{DummyArray, PimMatrixArena, PimRegion, PimScalarArena}; use pim_isa::{File, Instruction, Kernel}; pub const KERNEL: Kernel = Kernel([ diff --git a/pim-os/src/pim/kernel/matrix_vector_mul.rs b/pim-os/src/kernel/legacy/matrix_vector_mul.rs similarity index 96% rename from pim-os/src/pim/kernel/matrix_vector_mul.rs rename to pim-os/src/kernel/legacy/matrix_vector_mul.rs index 3313100..ac2e807 100644 --- a/pim-os/src/pim/kernel/matrix_vector_mul.rs +++ b/pim-os/src/kernel/legacy/matrix_vector_mul.rs @@ -1,4 +1,4 @@ -use crate::pim::array::{DummyArray, PimMatrixArena, PimRegion}; +use crate::pim::legacy::array::{DummyArray, PimMatrixArena, PimRegion}; use pim_isa::{File, Instruction, Kernel}; pub const KERNEL: Kernel = Kernel([ diff --git a/pim-os/src/lib.rs b/pim-os/src/lib.rs index 5ee2f57..2c96e80 100644 --- a/pim-os/src/lib.rs +++ b/pim-os/src/lib.rs @@ -4,10 +4,13 @@ use core::sync::atomic::{compiler_fence, Ordering}; mod alloc; +mod panic; + pub mod boot; pub mod critical_section; +pub mod kernel; pub mod m5op; -mod panic; +pub mod memory_config; pub mod pim; pub mod uart; diff --git a/pim-os/src/main.rs b/pim-os/src/main.rs deleted file mode 100644 index 58166c2..0000000 --- a/pim-os/src/main.rs +++ /dev/null @@ -1,86 +0,0 @@ -#![no_std] -#![no_main] - -extern crate alloc; - -use aarch64_cpu::asm::barrier; -use alloc::{boxed::Box, rc::Rc}; -use core::{cell::RefCell, fmt::Write}; -use half::f16; -use nalgebra::Matrix; -use pim_isa::BankMode; -use pim_os::{ - m5op, - pim::{ - self, - array::{DummyArray, PimMatrixArena, PimStorage, NUMBER_OF_BANKS}, - kernel::matrix_matrix_mul, - vector::{F16x1, F16x16}, - }, - uart::Uart0, -}; - -#[no_mangle] -pub extern "C" fn main() { - pim::state::set_kernel(&matrix_matrix_mul::KERNEL); - - let pim_matrix_arena0 = Rc::new(RefCell::new(PimMatrixArena( - [[[F16x16::default(); NUMBER_OF_BANKS]; 8]; 8], - ))); - let pim_matrix_arena1 = Rc::new(RefCell::new(PimMatrixArena( - [[[F16x16::default(); NUMBER_OF_BANKS]; 8]; 8], - ))); - let pim_matrix_arena2 = Rc::new(RefCell::new(PimMatrixArena( - [[[F16x16::default(); NUMBER_OF_BANKS]; 8]; 8], - ))); - - let mut matrix0 = Matrix::from_data(PimStorage { - arena: &pim_matrix_arena0, - index: 0, - }); - matrix0.fill_lower_triangle(F16x1(f16::ONE), 0); - - let mut matrix1 = Matrix::from_data(PimStorage { - arena: &pim_matrix_arena1, - index: 0, - }); - matrix1.fill_lower_triangle(F16x1(f16::ONE), 0); - - let matrix2 = Matrix::from_data(PimStorage { - arena: &pim_matrix_arena2, - index: 0, - }); - - writeln!(Uart0, "{matrix0} * {matrix1}\n=").unwrap(); - - let dummy_array = Box::new(DummyArray([F16x16::default(); NUMBER_OF_BANKS])); - - // Verify everything is correctly initialized before PIM operation - barrier::dsb(barrier::SY); - - // Execute kernel - { - let pim_matrix_arena0 = &pim_matrix_arena0.borrow(); - let pim_matrix_arena1 = &pim_matrix_arena1.borrow(); - let pim_matrix_arena2 = &mut pim_matrix_arena2.borrow_mut(); - - pim::state::set_bank_mode(BankMode::PimAllBank); - - m5op::reset_stats(); - - for _ in 0..100 { - matrix_matrix_mul::execute( - pim_matrix_arena0, - pim_matrix_arena1, - pim_matrix_arena2, - dummy_array.as_ref(), - ); - } - - m5op::dump_stats(); - - pim::state::set_bank_mode(BankMode::SingleBank); - } - - writeln!(Uart0, "{matrix2}").unwrap(); -} diff --git a/pim-os/src/memory_config.rs b/pim-os/src/memory_config.rs new file mode 100644 index 0000000..0799764 --- /dev/null +++ b/pim-os/src/memory_config.rs @@ -0,0 +1 @@ +pub const NUMBER_OF_BANKS: usize = 32; diff --git a/pim-os/src/pim.rs b/pim-os/src/pim.rs index 2ccbcd4..9fbea29 100644 --- a/pim-os/src/pim.rs +++ b/pim-os/src/pim.rs @@ -1,8 +1,7 @@ -pub mod array; pub mod config; pub mod continuous_array; pub mod interleaved_array; -pub mod kernel; +pub mod legacy; pub mod operation; pub mod state; pub mod vector; diff --git a/pim-os/src/pim/continuous_array.rs b/pim-os/src/pim/continuous_array.rs index 39207b2..2664df9 100644 --- a/pim-os/src/pim/continuous_array.rs +++ b/pim-os/src/pim/continuous_array.rs @@ -1,11 +1,15 @@ use super::vector::{F16x1, F16x16}; use core::fmt::Display; -use nalgebra::SMatrix; +use nalgebra::{SMatrix, SVector}; #[repr(C, align(65536))] #[derive(Debug)] pub struct Matrix(pub [SMatrix; X16R]); +#[repr(C, align(1024))] +#[derive(Debug)] +pub struct Vector(pub SVector); + impl Display for Matrix { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { for block in self.0.iter() { diff --git a/pim-os/src/pim/interleaved_array.rs b/pim-os/src/pim/interleaved_array.rs index 99e7ec0..4442aa1 100644 --- a/pim-os/src/pim/interleaved_array.rs +++ b/pim-os/src/pim/interleaved_array.rs @@ -1,4 +1,5 @@ -use super::{array::NUMBER_OF_BANKS, vector::F16x16}; +use super::vector::F16x16; +use crate::memory_config::NUMBER_OF_BANKS; use nalgebra::SVector; #[repr(C, align(512))] diff --git a/pim-os/src/pim/kernel.rs b/pim-os/src/pim/kernel.rs deleted file mode 100644 index b7f3750..0000000 --- a/pim-os/src/pim/kernel.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod matrix_matrix_add; -pub mod matrix_matrix_mul; -pub mod matrix_scalar_mul; -pub mod matrix_vector_mul; -pub mod samsung_matrix_vector_mul; diff --git a/pim-os/src/pim/legacy.rs b/pim-os/src/pim/legacy.rs new file mode 100644 index 0000000..615880a --- /dev/null +++ b/pim-os/src/pim/legacy.rs @@ -0,0 +1 @@ +pub mod array; \ No newline at end of file diff --git a/pim-os/src/pim/array.rs b/pim-os/src/pim/legacy/array.rs similarity index 98% rename from pim-os/src/pim/array.rs rename to pim-os/src/pim/legacy/array.rs index 1187f70..d0d88a4 100644 --- a/pim-os/src/pim/array.rs +++ b/pim-os/src/pim/legacy/array.rs @@ -1,10 +1,12 @@ -use super::vector::{F16x1, F16x16}; +use crate::{ + memory_config::NUMBER_OF_BANKS, + pim::vector::{F16x1, F16x16}, +}; use aarch64_cpu::asm::barrier; use core::{arch::asm, cell::RefCell}; use half::f16; use nalgebra::{Const, Dyn, RawStorage, RawStorageMut}; -pub const NUMBER_OF_BANKS: usize = 32; const EVEN_BANK_INDEX: usize = 0; const ODD_BANK_INDEX: usize = 8;