Add Vector Add Kernel

This commit is contained in:
2024-02-22 17:24:59 +01:00
parent 689236cfdb
commit c0de88a52d
3 changed files with 165 additions and 35 deletions

View File

@@ -6,36 +6,33 @@ extern crate alloc;
use aarch64_cpu::asm::barrier; use aarch64_cpu::asm::barrier;
use alloc::boxed::Box; use alloc::boxed::Box;
use core::fmt::Write; use core::fmt::Write;
use nalgebra::{SMatrix, SVector}; use half::f16;
use num_traits::{One, Zero}; use nalgebra::SVector;
use pim_isa::BankMode; use pim_isa::BankMode;
use pim_os::{ use pim_os::{
kernel::gemv, kernel::vadd,
pim::{ pim::{self, vector::F16x1},
self, interleaved_array,
vector::{F16x1, F16x16},
},
uart::Uart0, uart::Uart0,
}; };
const ROWS: usize = 32; const ROWS: usize = 2048;
const COLUMNS: usize = 128;
const X16_ROWS: usize = ROWS / 16;
const X16_COLUMNS: usize = COLUMNS / 16;
#[no_mangle] #[no_mangle]
pub extern "C" fn main() { pub extern "C" fn main() {
pim::state::set_kernel(&gemv::KERNEL); pim::state::set_kernel(&vadd::KERNEL);
let mut matrix = SMatrix::<_, ROWS, COLUMNS>::zeros(); let a = Box::new(pim::continuous_array::Vector(
matrix.fill_lower_triangle(F16x1::one(), 0); SVector::<F16x1, ROWS>::from_fn(|i, _| F16x1(f16::from_f32(i as _))),
));
let b = Box::new(pim::continuous_array::Vector(
SVector::<F16x1, ROWS>::from_fn(|i, _| F16x1(f16::from_f32((ROWS - i) as _))),
));
let pim_matrix = Box::new(pim::continuous_array::Matrix::<X16_ROWS, X16_COLUMNS>::from(matrix)); // writeln!(Uart0, "{}+{}=", a.0, b.0).unwrap();
let input_vector = SVector::<_, X16_COLUMNS>::from_element(F16x16::one()); let mut c = Box::new(pim::continuous_array::Vector(
let interleaved_input_vector = Box::new(interleaved_array::Vector::from(input_vector)); SVector::<F16x1, ROWS>::zeros(),
));
let mut output_partial_sum_vector = Box::new(SVector::<F16x16, ROWS>::zeros());
let dummy = Box::new(0); let dummy = Box::new(0);
@@ -46,24 +43,11 @@ pub extern "C" fn main() {
{ {
pim::state::set_bank_mode(BankMode::PimAllBank); pim::state::set_bank_mode(BankMode::PimAllBank);
gemv::execute( vadd::execute(&a.0, &b.0, &mut c.0, dummy.as_ref());
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); pim::state::set_bank_mode(BankMode::SingleBank);
} }
writeln!(Uart0, "{output_partial_sum_vector}").unwrap(); // writeln!(Uart0, "{}", c.0).unwrap();
writeln!(Uart0, "Done").unwrap();
let output_vector = SVector::<F16x1, ROWS>::from_fn(|r, _| {
output_partial_sum_vector[r]
.0
.iter()
.fold(F16x1::zero(), |acc, val| acc + *val)
});
writeln!(Uart0, "{output_vector}").unwrap();
} }

View File

@@ -1,2 +1,3 @@
pub mod legacy; pub mod legacy;
pub mod gemv; pub mod gemv;
pub mod vadd;

145
pim-os/src/kernel/vadd.rs Normal file
View File

@@ -0,0 +1,145 @@
use crate::pim::{operation::PimOperand, vector::F16x1};
use nalgebra::SVector;
use pim_isa::{File, Instruction, Kernel};
pub const KERNEL: Kernel = Kernel([
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 0 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 1 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 2 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 3 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 4 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 5 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 6 },
},
Instruction::MOV {
src: File::Bank,
dst: File::GrfA { index: 7 },
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 0 },
dst: File::GrfB { index: 0 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 1 },
dst: File::GrfB { index: 1 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 2 },
dst: File::GrfB { index: 2 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 3 },
dst: File::GrfB { index: 3 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 4 },
dst: File::GrfB { index: 4 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 5 },
dst: File::GrfB { index: 5 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 6 },
dst: File::GrfB { index: 6 },
aam: false,
},
Instruction::ADD {
src0: File::Bank,
src1: File::GrfA { index: 7 },
dst: File::GrfB { index: 7 },
aam: false,
},
Instruction::FILL {
src: File::GrfB { index: 0 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 1 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 2 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 3 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 4 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 5 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 6 },
dst: File::Bank,
},
Instruction::FILL {
src: File::GrfB { index: 7 },
dst: File::Bank,
},
Instruction::EXIT,
Instruction::NOP,
Instruction::NOP,
Instruction::NOP,
Instruction::NOP,
Instruction::NOP,
Instruction::NOP,
Instruction::NOP,
]);
pub fn execute<const R: usize>(
a: &SVector<F16x1, R>,
b: &SVector<F16x1, R>,
c: &mut SVector<F16x1, R>,
dummy: &impl PimOperand,
) {
a.fixed_rows_with_step::<8>(0, 16 * 16)
.iter()
.for_each(|entry| entry.execute_read());
b.fixed_rows_with_step::<8>(0, 16 * 16)
.iter()
.for_each(|entry| entry.execute_read());
c.fixed_rows_with_step_mut::<8>(0, 16 * 16)
.iter_mut()
.for_each(|entry| entry.execute_write());
dummy.execute_read();
}