Matrix to PIM-Matrix conversion
This commit is contained in:
@@ -26,17 +26,10 @@ const X16_COLUMNS: usize = COLUMNS / 16;
|
|||||||
pub extern "C" fn main() {
|
pub extern "C" fn main() {
|
||||||
pim::state::set_kernel(&samsung_matrix_vector_mul::KERNEL);
|
pim::state::set_kernel(&samsung_matrix_vector_mul::KERNEL);
|
||||||
|
|
||||||
let matrix = Box::new(pim::continuous_array::Matrix::<ROWS, X16_COLUMNS>(
|
let mut matrix = SMatrix::<_, ROWS, COLUMNS>::zeros();
|
||||||
SMatrix::from_fn(|r, c| {
|
matrix.fill_lower_triangle(F16x1::one(), 0);
|
||||||
if c > 0 {
|
|
||||||
return F16x16::zero();
|
let pim_matrix = Box::new(pim::continuous_array::Matrix::from(matrix));
|
||||||
}
|
|
||||||
|
|
||||||
let mut entry = F16x16::zero();
|
|
||||||
entry.0.iter_mut().take(r).for_each(|val| *val = F16x1::one());
|
|
||||||
|
|
||||||
entry
|
|
||||||
})));
|
|
||||||
|
|
||||||
let input_vector = SVector::<_, X16_COLUMNS>::from_element(F16x16::one());
|
let input_vector = SVector::<_, X16_COLUMNS>::from_element(F16x16::one());
|
||||||
let interleaved_input_vector = Box::new(interleaved_array::Vector::from(input_vector));
|
let interleaved_input_vector = Box::new(interleaved_array::Vector::from(input_vector));
|
||||||
@@ -53,7 +46,7 @@ pub extern "C" fn main() {
|
|||||||
pim::state::set_bank_mode(BankMode::PimAllBank);
|
pim::state::set_bank_mode(BankMode::PimAllBank);
|
||||||
|
|
||||||
samsung_matrix_vector_mul::execute(
|
samsung_matrix_vector_mul::execute(
|
||||||
matrix.as_ref(),
|
pim_matrix.as_ref(),
|
||||||
interleaved_input_vector.as_ref(),
|
interleaved_input_vector.as_ref(),
|
||||||
output_partial_sum_vector.as_mut(),
|
output_partial_sum_vector.as_mut(),
|
||||||
dummy.as_ref(),
|
dummy.as_ref(),
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#![feature(iter_array_chunks)]
|
||||||
#![no_std]
|
#![no_std]
|
||||||
|
|
||||||
use core::sync::atomic::{compiler_fence, Ordering};
|
use core::sync::atomic::{compiler_fence, Ordering};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use super::vector::F16x16;
|
use super::vector::{F16x1, F16x16};
|
||||||
use core::fmt::Display;
|
use core::fmt::Display;
|
||||||
use nalgebra::SMatrix;
|
use nalgebra::SMatrix;
|
||||||
|
|
||||||
@@ -11,3 +11,18 @@ impl<const R: usize, const C: usize> Display for Matrix<R, C> {
|
|||||||
self.0.fmt(f)
|
self.0.fmt(f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<const R: usize, const C: usize, const X16C: usize> From<SMatrix<F16x1, R, C>>
|
||||||
|
for Matrix<R, X16C>
|
||||||
|
{
|
||||||
|
fn from(matrix: SMatrix<F16x1, R, C>) -> Self {
|
||||||
|
Self(SMatrix::from_row_iterator(
|
||||||
|
matrix
|
||||||
|
.transpose()
|
||||||
|
.iter()
|
||||||
|
.map(|e| *e)
|
||||||
|
.array_chunks::<16>()
|
||||||
|
.map(|chunk| F16x16(chunk)),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user