First steps towards matrix multiplication

This commit is contained in:
2024-01-01 18:48:37 +01:00
parent dfa773b839
commit 05f184d51f
8 changed files with 409 additions and 197 deletions

View File

@@ -12,8 +12,8 @@ use core::{
use half::f16;
use nalgebra::Matrix;
use pim::{
array::{PimMatrixArena, PimRegion, PimStorage},
kernel::TEST_KERNEL,
array::{DummyArray, PimMatrixArena, PimRegion, PimStorage, NUMBER_OF_BANKS},
kernel::{execute_matrix_add, execute_matrix_multiply, MATRIX_ADD, MATRIX_MUL},
state::PimState,
vector::{F16x1, F16x16},
};
@@ -28,55 +28,64 @@ mod uart;
#[no_mangle]
pub extern "C" fn entry() -> ! {
let mut uart = Uart0;
let mut pim_state = PimState::new(&TEST_KERNEL);
let mut pim_state = PimState::new(&MATRIX_MUL);
pim_state.set_kernel();
let pim_matrix_arena0 = RefCell::new(PimMatrixArena([[F16x16::default(); 8]; 8]));
let pim_matrix_arena1 = RefCell::new(PimMatrixArena([[F16x16::default(); 8]; 8]));
let pim_matrix_arena0 = RefCell::new(PimMatrixArena(
[[[F16x16::default(); NUMBER_OF_BANKS]; 8]; 8],
));
let pim_matrix_arena1 = RefCell::new(PimMatrixArena(
[[[F16x16::default(); NUMBER_OF_BANKS]; 8]; 8],
));
let pim_matrix_arena2 = RefCell::new(PimMatrixArena(
[[[F16x16::default(); NUMBER_OF_BANKS]; 8]; 8],
));
let pim_storage0 = PimStorage {
arena: &pim_matrix_arena0,
index: 0,
row_major: true,
};
let pim_storage1 = PimStorage {
arena: &pim_matrix_arena1,
index: 0,
row_major: false,
};
let pim_storage2 = PimStorage {
arena: &pim_matrix_arena2,
index: 0,
row_major: false,
};
let mut matrix0 = Matrix::from_data(pim_storage0);
matrix0.fill_column(0, F16x1(f16::ZERO));
matrix0.fill_column(1, F16x1(f16::ONE));
matrix0.fill_column(2, F16x1(f16::PI));
matrix0.fill_column(3, F16x1(f16::E));
matrix0.fill_column(4, F16x1(f16::EPSILON));
matrix0.fill_column(5, F16x1(f16::SQRT_2));
matrix0.fill_column(6, F16x1(f16::LN_2));
matrix0.fill_column(7, F16x1(f16::LN_10));
matrix0.fill(F16x1(f16::ONE));
let mut matrix1 = Matrix::from_data(pim_storage1);
matrix1.fill_lower_triangle(F16x1(f16::ONE), 0);
writeln!(&mut uart, "{matrix0} + {matrix1}\n=").unwrap();
let matrix2 = Matrix::from_data(pim_storage2);
writeln!(&mut uart, "{matrix0} * {matrix1}\n=").unwrap();
// Invalidate and flush array just in case
pim_matrix_arena0.borrow_mut().invalidate_flush();
pim_matrix_arena1.borrow_mut().invalidate_flush();
pim_matrix_arena2.borrow_mut().invalidate_flush();
let dummy_array = DummyArray([F16x16::default(); NUMBER_OF_BANKS]);
barrier::dsb(barrier::SY);
pim_state.set_bank_mode(BankMode::PimAllBank);
pim_matrix_arena0
.borrow()
.execute_instruction_read_dual_bank();
pim_matrix_arena1
.borrow()
.execute_instruction_read_dual_bank();
pim_matrix_arena0
.borrow_mut()
.execute_instruction_write_dual_bank();
pim_state.set_bank_mode(BankMode::SingleBank);
// execute_matrix_add(&pim_matrix_arena0, &pim_matrix_arena1, &dummy_array);
execute_matrix_multiply(
&mut pim_state,
&pim_matrix_arena0,
&pim_matrix_arena1,
&pim_matrix_arena2,
&dummy_array,
);
pim_matrix_arena0.borrow_mut().invalidate();
pim_matrix_arena2.borrow_mut().invalidate();
barrier::dsb(barrier::SY);
writeln!(&mut uart, "{matrix0}").unwrap();
writeln!(&mut uart, "{matrix2}").unwrap();
m5ops::exit();