diff --git a/pim-os/build.sh b/pim-os/build.sh new file mode 100755 index 0000000..ceffb9e --- /dev/null +++ b/pim-os/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +CARGO_TARGET_DIR=kernels/X1 cargo build --release --features X1 +CARGO_TARGET_DIR=kernels/X2 cargo build --release --features X2 +CARGO_TARGET_DIR=kernels/X3 cargo build --release --features X3 +CARGO_TARGET_DIR=kernels/X4 cargo build --release --features X4 diff --git a/pim-os/src/bin/classic_gemv.rs b/pim-os/src/bin/classic_gemv.rs new file mode 100644 index 0000000..3286085 --- /dev/null +++ b/pim-os/src/bin/classic_gemv.rs @@ -0,0 +1,45 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +use core::{arch::asm, fmt::Write}; +use nalgebra::{SMatrix, SVector}; +use pim_os::{pim::vector::F16x1, uart::Uart0}; + +#[cfg(feature = "X1")] +const ROWS: usize = 128; + +#[cfg(feature = "X2")] +const ROWS: usize = 256; + +#[cfg(feature = "X3")] +const ROWS: usize = 512; + +#[cfg(feature = "X4")] +const ROWS: usize = 1024; + +const COLUMNS: usize = 128; + +#[no_mangle] +pub extern "C" fn main() { + let matrix = SMatrix::::zeros(); + let input_vector = SVector::::zeros(); + + // Flush cache + for element in matrix.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + for element in input_vector.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + + pim_os::m5op::exit(0); + for _ in 0..10 { + 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 new file mode 100644 index 0000000..7cedc21 --- /dev/null +++ b/pim-os/src/bin/classic_gemv_layers.rs @@ -0,0 +1,46 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +use core::fmt::Write; +use half::f16; +use nalgebra::{SMatrix, SVector}; +use pim_os::{pim::vector::F16x1, uart::Uart0}; + +#[cfg(feature = "X1")] +const DIMENSIONS: usize = 128; + +#[cfg(feature = "X2")] +const DIMENSIONS: usize = 256; + +#[cfg(feature = "X3")] +const DIMENSIONS: usize = 512; + +#[cfg(feature = "X4")] +const DIMENSIONS: usize = 1024; + +const ROWS: usize = DIMENSIONS; +const COLUMNS: usize = DIMENSIONS; + +#[no_mangle] +pub extern "C" fn main() { + let matrix = SMatrix::::zeros(); + let mut input_vector = SVector::::zeros(); + + pim_os::m5op::exit(0); + for _ in 0..1 { + input_vector = matrix * input_vector; + input_vector = input_vector.map(|element| { + if element.0 < f16::ZERO { + F16x1(f16::ZERO) + } else { + element + } + }); + 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 new file mode 100644 index 0000000..9594543 --- /dev/null +++ b/pim-os/src/bin/classic_haxpy.rs @@ -0,0 +1,46 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +use core::{arch::asm, fmt::Write}; +use nalgebra::SVector; +use num_traits::identities::Zero; +use pim_os::{pim::vector::F16x1, uart::Uart0}; + +#[cfg(feature = "X1")] +const ROWS: usize = 256; + +#[cfg(feature = "X2")] +const ROWS: usize = 512; + +#[cfg(feature = "X3")] +const ROWS: usize = 1024; + +#[cfg(feature = "X4")] +const ROWS: usize = 2048; + +#[no_mangle] +pub extern "C" fn main() { + let a = SVector::::zeros(); + let b = SVector::::zeros(); + let s = F16x1::zero(); + + // Flush cache + for element in a.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + for element in b.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + + pim_os::m5op::exit(0); + 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); + + writeln!(Uart0, "Done").unwrap(); +} diff --git a/pim-os/src/bin/classic_vadd.rs b/pim-os/src/bin/classic_vadd.rs new file mode 100644 index 0000000..d76d2dc --- /dev/null +++ b/pim-os/src/bin/classic_vadd.rs @@ -0,0 +1,42 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +use core::{arch::asm, fmt::Write}; +use nalgebra::SVector; +use pim_os::{pim::vector::F16x1, uart::Uart0}; + +#[cfg(feature = "X1")] +const ROWS: usize = 256; + +#[cfg(feature = "X2")] +const ROWS: usize = 512; + +#[cfg(feature = "X3")] +const ROWS: usize = 1024; + +#[cfg(feature = "X4")] +const ROWS: usize = 2048; + +#[no_mangle] +pub extern "C" fn main() { + let a = SVector::::zeros(); + let b = SVector::::zeros(); + + for element in a.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + for element in b.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + + pim_os::m5op::exit(0); + for _ in 0..10 { + 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 new file mode 100644 index 0000000..fcff7c9 --- /dev/null +++ b/pim-os/src/bin/classic_vmul.rs @@ -0,0 +1,42 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +use core::{arch::asm, fmt::Write}; +use nalgebra::SVector; +use pim_os::{pim::vector::F16x1, uart::Uart0}; + +#[cfg(feature = "X1")] +const ROWS: usize = 256; + +#[cfg(feature = "X2")] +const ROWS: usize = 512; + +#[cfg(feature = "X3")] +const ROWS: usize = 1024; + +#[cfg(feature = "X4")] +const ROWS: usize = 2048; + +#[no_mangle] +pub extern "C" fn main() { + let a = SVector::::zeros(); + let b = SVector::::zeros(); + + for element in a.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + for element in b.iter() { + unsafe { asm!("dc civac, {val}", val = in(reg) element) } + } + + pim_os::m5op::exit(0); + for _ in 0..10 { + let c = a.component_mul(&b); + core::hint::black_box(c); + } + pim_os::m5op::exit(0); + + writeln!(Uart0, "Done").unwrap(); +}