diff --git a/.gitignore b/.gitignore index ea8c4bf..eb5a316 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -/target +target diff --git a/pim-isa/Cargo.lock b/pim-isa/Cargo.lock new file mode 100644 index 0000000..ce66ae9 --- /dev/null +++ b/pim-isa/Cargo.lock @@ -0,0 +1,65 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "pim-isa" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/pim-isa/Cargo.toml b/pim-isa/Cargo.toml new file mode 100644 index 0000000..c04da4a --- /dev/null +++ b/pim-isa/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "pim-isa" +version = "0.1.0" +edition = "2021" + +[features] +default = ["std"] +std = [] + +[dependencies] +serde = { version = "1.0", default-features = false, features = ["derive"] } diff --git a/pim-isa/src/lib.rs b/pim-isa/src/lib.rs new file mode 100644 index 0000000..050ff1a --- /dev/null +++ b/pim-isa/src/lib.rs @@ -0,0 +1,40 @@ +#![cfg_attr(not(feature = "std"), no_std)] + +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum Instruction { + NOP, + EXIT, + JUMP { offset: i16, count: u16 }, + MOV { src: File, dst: File }, + FILL { src: File, dst: File }, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum File { + Grf { index: u8 }, + SrfM { index: u8 }, + SrfA { index: u8 }, + Bank, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Kernel(pub [Instruction; 32]); + +impl Kernel { + pub const NOP: Kernel = Kernel([Instruction::NOP; 32]); +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct PimConfig { + pub bank_mode: BankMode, + pub kernel: Kernel, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum BankMode { + SingleBank, + AllBank, + PimAllBank, +} diff --git a/.cargo/config b/pim-os/.cargo/config similarity index 100% rename from .cargo/config rename to pim-os/.cargo/config diff --git a/pim-os/Cargo.lock b/pim-os/Cargo.lock new file mode 100644 index 0000000..42b0091 --- /dev/null +++ b/pim-os/Cargo.lock @@ -0,0 +1,225 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aarch64-cpu" +version = "9.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac42a04a61c19fc8196dd728022a784baecc5d63d7e256c01ad1b3fbfab26287" +dependencies = [ + "tock-registers", +] + +[[package]] +name = "atomic-polyfill" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "pim-isa" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "pim-os" +version = "0.1.0" +dependencies = [ + "aarch64-cpu", + "half", + "pim-isa", + "serde", + "serde-json-core", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9e1ab533c0bc414c34920ec7e5f097101d126ed5eac1a1aac711222e0bbb33" +dependencies = [ + "heapless", + "ryu", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tock-registers" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "696941a0aee7e276a165a978b37918fd5d22c55c3d6bda197813070ca9c0f21c" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" diff --git a/Cargo.toml b/pim-os/Cargo.toml similarity index 84% rename from Cargo.toml rename to pim-os/Cargo.toml index ff06dbd..d09c0d1 100644 --- a/Cargo.toml +++ b/pim-os/Cargo.toml @@ -8,6 +8,7 @@ aarch64-cpu = "9.4.0" half = { version = "2.3.1", default-features = false } serde = { version = "1.0", default-features = false, features = ["derive"] } serde-json-core = "0.5.1" +pim-isa = { path = "../pim-isa", default-features = false } [profile.dev] panic = "abort" diff --git a/aarch64-gem5.ld b/pim-os/aarch64-gem5.ld similarity index 100% rename from aarch64-gem5.ld rename to pim-os/aarch64-gem5.ld diff --git a/src/m5ops.rs b/pim-os/src/m5ops.rs similarity index 100% rename from src/m5ops.rs rename to pim-os/src/m5ops.rs diff --git a/src/main.rs b/pim-os/src/main.rs similarity index 62% rename from src/main.rs rename to pim-os/src/main.rs index dcbe97f..c3f1def 100644 --- a/src/main.rs +++ b/pim-os/src/main.rs @@ -7,11 +7,9 @@ use core::{ panic::PanicInfo, sync::atomic::{self, Ordering}, }; -use pim::{ - array::PimArray, - config::PimConfig, - kernel::{NOP_KERNEL, TEST_KERNEL}, -}; +use half::f16; +use pim::{array::BankArray, kernel::TEST_KERNEL}; +use pim_isa::{BankMode, PimConfig}; use uart::Uart0; mod m5ops; @@ -20,12 +18,12 @@ mod uart; global_asm!(include_str!("start.s")); -static mut TEST_ARRAY: PimArray = PimArray([0; 256]); +static mut TEST_ARRAY: BankArray = BankArray([f16::ZERO; 512]); #[no_mangle] pub extern "C" fn entry() -> ! { - let mut pim_config = pim::config::PimConfig { - bank_mode: pim::config::BankMode::PimAllBank, + let mut pim_config = PimConfig { + bank_mode: BankMode::PimAllBank, kernel: TEST_KERNEL, }; let mut pim_writer = pim::config::PimWriter; @@ -40,10 +38,22 @@ pub extern "C" fn entry() -> ! { .unwrap(); writeln!(&mut uart, "Read from all banks").unwrap(); - // Invalidate array just in case + // Invalidate and flush array just in case for element in TEST_ARRAY.0.iter().step_by(8) { - asm!("dc ivac, {val}", val = in(reg) element); + asm!("dc civac, {val}", val = in(reg) element); } + asm!("dsb sy"); + + + // Fetch single cache line in array + // core::ptr::read_volatile(&TEST_ARRAY.0[0]); + + // Zero array to prevent fetch + // for element in TEST_ARRAY.0.iter().step_by(8) { + // asm!("dc zva, {val}", val = in(reg) element); + // } + asm!("dc zva, {val}", val = in(reg) &TEST_ARRAY.0[0]); + asm!("dsb sy"); pim_writer.write( serde_json_core::to_string::(&pim_config) @@ -51,13 +61,15 @@ pub extern "C" fn entry() -> ! { .as_str(), ); - // Fetch single cache line in array - core::ptr::read_volatile(&TEST_ARRAY.0[0]); - core::ptr::read_volatile(&TEST_ARRAY.0[8]); + core::ptr::write_volatile(&mut TEST_ARRAY.0[0], f16::ZERO); + // Invalidate and flush + // for element in TEST_ARRAY.0.iter().step_by(8) { + asm!("dc civac, {val}", val = in(reg) &TEST_ARRAY.0[0]); + // } asm!("dsb sy"); - pim_config.bank_mode = pim::config::BankMode::SingleBank; + pim_config.bank_mode = BankMode::SingleBank; pim_writer.write( serde_json_core::to_string::(&pim_config) .unwrap() diff --git a/src/pim.rs b/pim-os/src/pim.rs similarity index 69% rename from src/pim.rs rename to pim-os/src/pim.rs index 9aefa56..ca0f348 100644 --- a/src/pim.rs +++ b/pim-os/src/pim.rs @@ -1,4 +1,3 @@ pub mod array; pub mod config; -pub mod instruction; pub mod kernel; diff --git a/pim-os/src/pim/array.rs b/pim-os/src/pim/array.rs new file mode 100644 index 0000000..5daea29 --- /dev/null +++ b/pim-os/src/pim/array.rs @@ -0,0 +1,8 @@ +use half::f16; + +#[derive(Debug)] +#[repr(C, align(1024))] +pub struct BankArray(pub [f16; 512]); + +#[derive(Debug)] +pub struct ComputeArray(pub [BankArray; N]); diff --git a/pim-os/src/pim/config.rs b/pim-os/src/pim/config.rs new file mode 100644 index 0000000..b0a4713 --- /dev/null +++ b/pim-os/src/pim/config.rs @@ -0,0 +1,26 @@ +use core::arch::asm; + + +#[link_section = ".pim_config"] +static mut PIM_CONFIG_REGION: [u8; 0x4000] = [0; 0x4000]; + +const CACHE_LINE_SIZE: usize = 32; + +pub struct PimWriter; + +impl PimWriter { + pub fn write(&mut self, s: &str) { + unsafe { + PIM_CONFIG_REGION[..s.len()].copy_from_slice(s.as_bytes()); + PIM_CONFIG_REGION[s.len()] = b'\0'; + + // Flush all cache lines that were affected by write operation + for element in PIM_CONFIG_REGION[..s.len()].iter().step_by(CACHE_LINE_SIZE) { + asm!("dc civac, {val}", val = in(reg) element); + } + + // Wait on all flushes to complete + asm!("dsb sy"); + } + } +} diff --git a/src/pim/kernel.rs b/pim-os/src/pim/kernel.rs similarity index 69% rename from src/pim/kernel.rs rename to pim-os/src/pim/kernel.rs index 4c1a913..e077473 100644 --- a/src/pim/kernel.rs +++ b/pim-os/src/pim/kernel.rs @@ -1,14 +1,18 @@ -use super::instruction::Instruction; -use serde::Serialize; +use pim_isa::{File, Instruction, Kernel}; -#[derive(Debug, Serialize)] -pub struct Kernel([Instruction; 32]); - -pub const NOP_KERNEL: Kernel = Kernel([Instruction::NOP; 32]); pub const TEST_KERNEL: Kernel = Kernel([ - Instruction::NOP, - Instruction::EXIT, - Instruction::JUMP { offset: 1, count: 12 }, + Instruction::FILL { + src: File::Grf { index: 0 }, + dst: File::Bank, + }, + Instruction::MOV { + src: File::Bank, + dst: File::Grf { index: 1 }, + }, + Instruction::JUMP { + offset: 1, + count: 12, + }, Instruction::EXIT, Instruction::NOP, Instruction::EXIT, diff --git a/src/start.s b/pim-os/src/start.s similarity index 100% rename from src/start.s rename to pim-os/src/start.s diff --git a/src/uart.rs b/pim-os/src/uart.rs similarity index 100% rename from src/uart.rs rename to pim-os/src/uart.rs diff --git a/pim-vm/Cargo.lock b/pim-vm/Cargo.lock new file mode 100644 index 0000000..aae5113 --- /dev/null +++ b/pim-vm/Cargo.lock @@ -0,0 +1,468 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "cxx" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7129e341034ecb940c9072817cd9007974ea696844fc4dd582dc1653a7fbe2e8" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06fdd177fc61050d63f67f5bd6351fac6ab5526694ea8e359cd9cd3b75857f44" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.110" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "587663dd5fb3d10932c8aecfe7c844db1bcf0aee93eeab08fac13dc1212c2e7f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_logger" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "link-cplusplus" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" +dependencies = [ + "cc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "pim-isa" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "pim-vm" +version = "0.1.0" +dependencies = [ + "cxx", + "env_logger", + "half", + "log", + "pim-isa", + "serde_json", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustix" +version = "0.38.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" diff --git a/pim-vm/Cargo.toml b/pim-vm/Cargo.toml new file mode 100644 index 0000000..fd624fa --- /dev/null +++ b/pim-vm/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "pim-vm" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["staticlib"] + +[dependencies] +cxx = "1.0.110" +env_logger = "0.10.1" +half = "2.3.1" +log = "0.4.20" +pim-isa = { path = "../pim-isa" } +serde_json = "1.0.108" diff --git a/pim-vm/src/lib.rs b/pim-vm/src/lib.rs new file mode 100644 index 0000000..5c23a07 --- /dev/null +++ b/pim-vm/src/lib.rs @@ -0,0 +1,179 @@ +use half::f16; +use pim_isa::{BankMode, File, Instruction, Kernel, PimConfig}; +use std::io::Cursor; + +#[cxx::bridge(namespace = "pim_vm")] +mod ffi { + pub enum BankMode { + SingleBank, + AllBank, + PimAllBank, + } + + extern "Rust" { + type PimVM; + + fn new_pim_vm(num_pim_units: u32) -> Box; + fn reset(&mut self); + fn apply_config(&mut self, config: &str); + fn bank_mode(&self) -> BankMode; + fn execute_read(&mut self, bank_index: u32, data: &[u8]); + fn execute_write(&mut self, bank_index: u32) -> [u8; 32]; + + fn init_logger(); + } +} + +fn init_logger() { + env_logger::init(); +} + +const GRF_NUM_REGISTERS: usize = 16; +const SRF_A_NUM_REGISTERS: usize = 8; +const SRF_M_NUM_REGISTERS: usize = 8; + +const REG_NUM_ENTRIES: usize = 16; +type Register = [f16; REG_NUM_ENTRIES]; + +#[derive(Clone, Debug)] +struct PimUnit { + grf: [Register; GRF_NUM_REGISTERS], + srf_a: [Register; SRF_A_NUM_REGISTERS], + srf_m: [Register; SRF_A_NUM_REGISTERS], + pc: u8, +} + +impl Default for PimUnit { + fn default() -> Self { + Self { + grf: [[f16::PI; REG_NUM_ENTRIES]; GRF_NUM_REGISTERS], + srf_a: [[f16::ZERO; REG_NUM_ENTRIES]; SRF_A_NUM_REGISTERS], + srf_m: [[f16::ZERO; REG_NUM_ENTRIES]; SRF_M_NUM_REGISTERS], + pc: 0, + } + } +} + +#[derive(Debug)] +struct PimVM { + pim_units: Vec, + pim_config: pim_isa::PimConfig, +} + +impl PimVM { + fn reset(&mut self) { + for unit in self.pim_units.iter_mut() { + unit.pc = 0; + } + } + + fn apply_config(&mut self, config_str: &str) { + log::debug!("Config string:\n{config_str}"); + + self.pim_config = serde_json::from_str::(config_str).unwrap(); + self.reset(); + + log::debug!("Apply pim config:\n{:?}", self.pim_config); + } + + fn bank_mode(&self) -> ffi::BankMode { + match self.pim_config.bank_mode { + BankMode::SingleBank => ffi::BankMode::SingleBank, + BankMode::AllBank => ffi::BankMode::AllBank, + BankMode::PimAllBank => ffi::BankMode::PimAllBank, + } + } +} + +fn new_pim_vm(num_pim_units: u32) -> Box { + Box::new(PimVM { + pim_units: vec![PimUnit::default(); num_pim_units as _], + pim_config: PimConfig { + bank_mode: BankMode::SingleBank, + kernel: Kernel::NOP, + }, + }) +} + +#[repr(C)] +struct BankData([f16; REG_NUM_ENTRIES]); + +impl PimVM { + pub fn execute_read(&mut self, bank_index: u32, bank_data: &[u8]) { + assert_eq!(bank_data.len(), 32); + + let pim_unit = &mut self.pim_units[bank_index as usize]; + + let current_pc = pim_unit.pc; + pim_unit.pc += 1; + + let inst = &self.pim_config.kernel.0[current_pc as usize]; + + log::debug!("PimUnit {bank_index} Execute PC {current_pc}: {inst:?}"); + + match inst { + Instruction::NOP => (), + Instruction::EXIT => (), + Instruction::JUMP { offset, count } => todo!(), + Instruction::MOV { src, dst } => { + let data: [f16; REG_NUM_ENTRIES] = match src { + File::Grf { index } => pim_unit.grf[*index as usize], + File::Bank => unsafe { + std::ptr::read(bank_data.as_ptr() as *const BankData).0 + }, + _ => panic!("Unsupported src operand: {src:?}"), + }; + + match dst { + File::Grf { index } => pim_unit.grf[*index as usize] = data, + File::SrfM { index } => pim_unit.srf_m[*index as usize] = data, + File::SrfA { index } => pim_unit.srf_a[*index as usize] = data, + _ => panic!("Unsupported dst operand: {dst:?}"), + } + } + Instruction::FILL { src, dst } => { + let data: [f16; REG_NUM_ENTRIES] = match src { + File::Grf { index } => pim_unit.grf[*index as usize], + File::Bank => unsafe { + std::ptr::read(bank_data.as_ptr() as *const BankData).0 + }, + _ => panic!("Unsupported src operand: {src:?}"), + }; + + match dst { + File::Grf { index } => pim_unit.grf[*index as usize] = data, + _ => panic!("Unsupported dst operand: {dst:?}"), + } + } + } + } + + pub fn execute_write(&mut self, bank_index: u32) -> [u8; 32] { + let pim_unit = &mut self.pim_units[bank_index as usize]; + + let current_pc = pim_unit.pc; + pim_unit.pc += 1; + + let inst = &self.pim_config.kernel.0[current_pc as usize]; + + log::debug!("PimUnit {bank_index} Execute PC {current_pc}: {inst:?}"); + + let data = match inst { + Instruction::FILL { src, dst } => { + let data: [f16; REG_NUM_ENTRIES] = match src { + File::Grf { index } => pim_unit.grf[*index as usize], + _ => panic!("Unsupported src operand: {src:?}"), + }; + + if *dst != File::Bank { + panic!("Unsupported dst operand: {dst:?}") + } + + data + } + _ => panic!("Unsupported instruction for write: {inst:?}"), + }; + + unsafe { std::mem::transmute(data) } + } +} diff --git a/src/pim/array.rs b/src/pim/array.rs deleted file mode 100644 index 685a108..0000000 --- a/src/pim/array.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[derive(Debug)] -#[repr(C, align(1024))] -pub struct PimArray(pub [u32; 256]); diff --git a/src/pim/config.rs b/src/pim/config.rs deleted file mode 100644 index 71ac50d..0000000 --- a/src/pim/config.rs +++ /dev/null @@ -1,63 +0,0 @@ -use core::arch::asm; -use serde::Serialize; - -use super::kernel::Kernel; - -#[link_section = ".pim_config"] -static mut PIM_CONFIG_REGION: [u8; 0x4000] = [0; 0x4000]; - -const CACHE_LINE_SIZE: usize = 32; - -pub struct PimWriter; - -impl PimWriter { - pub fn write(&mut self, s: &str) { - unsafe { - // Preload the cache lines so that no unnecessary fetch to memory is made - // This prevents unwanted PIM cycles when disabling PIM mode - // We cannot do this in a for loop as this triggers memory fetches itself - // Try to find a better solution - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*0]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*1]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*2]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*3]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*4]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*5]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*6]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*7]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*8]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*9]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*10]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*11]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*12]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*13]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*14]); - // asm!("dc zva, {val}", val = in(reg) &PIM_CONFIG_REGION[CACHE_LINE_SIZE*15]); - - // Do the copy - PIM_CONFIG_REGION[..s.len()].copy_from_slice(s.as_bytes()); - PIM_CONFIG_REGION[s.len()] = b'\0'; - - // Flush all cache lines that were affected by write operation - for element in PIM_CONFIG_REGION[..s.len()].iter().step_by(CACHE_LINE_SIZE) { - asm!("dc civac, {val}", val = in(reg) element); - } - - // Wait on all flushes to complete - asm!("dsb sy"); - } - } -} - -#[derive(Serialize, Debug)] -pub struct PimConfig { - pub bank_mode: BankMode, - pub kernel: Kernel, -} - -#[derive(Serialize, Debug)] -pub enum BankMode { - SingleBank, - AllBank, - PimAllBank, -} diff --git a/src/pim/instruction.rs b/src/pim/instruction.rs deleted file mode 100644 index c53cf1e..0000000 --- a/src/pim/instruction.rs +++ /dev/null @@ -1,18 +0,0 @@ -use serde::Serialize; - -#[derive(Clone, Copy, Debug, Serialize)] -#[serde(tag = "type")] -pub enum Instruction { - NOP, - EXIT, - JUMP { offset: i16, count: u16 }, - MOV { src: File, dst: File }, -} - -#[derive(Clone, Copy, Debug, Serialize)] -pub enum File { - GRF { index: u8 }, - SRF_M { index: u8 }, - SRF_A { index: u8 }, - BANK, -}