Created
January 21, 2025 17:40
-
-
Save leonardoalt/73c12e054f9e9d3a1691dc5699404029 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![no_main] | |
#![no_std] | |
extern crate powdr_riscv_runtime; | |
#[no_mangle] | |
fn main() { | |
loop_test_matrix(); | |
} | |
const SIZE: usize = 6; | |
type Mat = [[i32; SIZE]; SIZE]; | |
#[no_mangle] | |
#[inline(never)] | |
fn matrix_multiply_unrolled(a: &Mat, b: &Mat, c: &mut Mat) { | |
c[0][0] = a[0][0] * b[0][0] | |
+ a[0][1] * b[1][0] | |
+ a[0][2] * b[2][0] | |
+ a[0][3] * b[3][0] | |
+ a[0][4] * b[4][0] | |
+ a[0][5] * b[5][0]; | |
c[0][1] = a[0][0] * b[0][1] | |
+ a[0][1] * b[1][1] | |
+ a[0][2] * b[2][1] | |
+ a[0][3] * b[3][1] | |
+ a[0][4] * b[4][1] | |
+ a[0][5] * b[5][1]; | |
c[0][2] = a[0][0] * b[0][2] | |
+ a[0][1] * b[1][2] | |
+ a[0][2] * b[2][2] | |
+ a[0][3] * b[3][2] | |
+ a[0][4] * b[4][2] | |
+ a[0][5] * b[5][2]; | |
c[0][3] = a[0][0] * b[0][3] | |
+ a[0][1] * b[1][3] | |
+ a[0][2] * b[2][3] | |
+ a[0][3] * b[3][3] | |
+ a[0][4] * b[4][3] | |
+ a[0][5] * b[5][3]; | |
c[0][4] = a[0][0] * b[0][4] | |
+ a[0][1] * b[1][4] | |
+ a[0][2] * b[2][4] | |
+ a[0][3] * b[3][4] | |
+ a[0][4] * b[4][4] | |
+ a[0][5] * b[5][4]; | |
c[0][5] = a[0][0] * b[0][5] | |
+ a[0][1] * b[1][5] | |
+ a[0][2] * b[2][5] | |
+ a[0][3] * b[3][5] | |
+ a[0][4] * b[4][5] | |
+ a[0][5] * b[5][5]; | |
c[1][0] = a[1][0] * b[0][0] | |
+ a[1][1] * b[1][0] | |
+ a[1][2] * b[2][0] | |
+ a[1][3] * b[3][0] | |
+ a[1][4] * b[4][0] | |
+ a[1][5] * b[5][0]; | |
c[1][1] = a[1][0] * b[0][1] | |
+ a[1][1] * b[1][1] | |
+ a[1][2] * b[2][1] | |
+ a[1][3] * b[3][1] | |
+ a[1][4] * b[4][1] | |
+ a[1][5] * b[5][1]; | |
c[1][2] = a[1][0] * b[0][2] | |
+ a[1][1] * b[1][2] | |
+ a[1][2] * b[2][2] | |
+ a[1][3] * b[3][2] | |
+ a[1][4] * b[4][2] | |
+ a[1][5] * b[5][2]; | |
c[1][3] = a[1][0] * b[0][3] | |
+ a[1][1] * b[1][3] | |
+ a[1][2] * b[2][3] | |
+ a[1][3] * b[3][3] | |
+ a[1][4] * b[4][3] | |
+ a[1][5] * b[5][3]; | |
c[1][4] = a[1][0] * b[0][4] | |
+ a[1][1] * b[1][4] | |
+ a[1][2] * b[2][4] | |
+ a[1][3] * b[3][4] | |
+ a[1][4] * b[4][4] | |
+ a[1][5] * b[5][4]; | |
c[1][5] = a[1][0] * b[0][5] | |
+ a[1][1] * b[1][5] | |
+ a[1][2] * b[2][5] | |
+ a[1][3] * b[3][5] | |
+ a[1][4] * b[4][5] | |
+ a[1][5] * b[5][5]; | |
c[2][0] = a[2][0] * b[0][0] | |
+ a[2][1] * b[1][0] | |
+ a[2][2] * b[2][0] | |
+ a[2][3] * b[3][0] | |
+ a[2][4] * b[4][0] | |
+ a[2][5] * b[5][0]; | |
c[2][1] = a[2][0] * b[0][1] | |
+ a[2][1] * b[1][1] | |
+ a[2][2] * b[2][1] | |
+ a[2][3] * b[3][1] | |
+ a[2][4] * b[4][1] | |
+ a[2][5] * b[5][1]; | |
c[2][2] = a[2][0] * b[0][2] | |
+ a[2][1] * b[1][2] | |
+ a[2][2] * b[2][2] | |
+ a[2][3] * b[3][2] | |
+ a[2][4] * b[4][2] | |
+ a[2][5] * b[5][2]; | |
c[2][3] = a[2][0] * b[0][3] | |
+ a[2][1] * b[1][3] | |
+ a[2][2] * b[2][3] | |
+ a[2][3] * b[3][3] | |
+ a[2][4] * b[4][3] | |
+ a[2][5] * b[5][3]; | |
c[2][4] = a[2][0] * b[0][4] | |
+ a[2][1] * b[1][4] | |
+ a[2][2] * b[2][4] | |
+ a[2][3] * b[3][4] | |
+ a[2][4] * b[4][4] | |
+ a[2][5] * b[5][4]; | |
c[2][5] = a[2][0] * b[0][5] | |
+ a[2][1] * b[1][5] | |
+ a[2][2] * b[2][5] | |
+ a[2][3] * b[3][5] | |
+ a[2][4] * b[4][5] | |
+ a[2][5] * b[5][5]; | |
c[3][0] = a[3][0] * b[0][0] | |
+ a[3][1] * b[1][0] | |
+ a[3][2] * b[2][0] | |
+ a[3][3] * b[3][0] | |
+ a[3][4] * b[4][0] | |
+ a[3][5] * b[5][0]; | |
c[3][1] = a[3][0] * b[0][1] | |
+ a[3][1] * b[1][1] | |
+ a[3][2] * b[2][1] | |
+ a[3][3] * b[3][1] | |
+ a[3][4] * b[4][1] | |
+ a[3][5] * b[5][1]; | |
c[3][2] = a[3][0] * b[0][2] | |
+ a[3][1] * b[1][2] | |
+ a[3][2] * b[2][2] | |
+ a[3][3] * b[3][2] | |
+ a[3][4] * b[4][2] | |
+ a[3][5] * b[5][2]; | |
c[3][3] = a[3][0] * b[0][3] | |
+ a[3][1] * b[1][3] | |
+ a[3][2] * b[2][3] | |
+ a[3][3] * b[3][3] | |
+ a[3][4] * b[4][3] | |
+ a[3][5] * b[5][3]; | |
c[3][4] = a[3][0] * b[0][4] | |
+ a[3][1] * b[1][4] | |
+ a[3][2] * b[2][4] | |
+ a[3][3] * b[3][4] | |
+ a[3][4] * b[4][4] | |
+ a[3][5] * b[5][4]; | |
c[3][5] = a[3][0] * b[0][5] | |
+ a[3][1] * b[1][5] | |
+ a[3][2] * b[2][5] | |
+ a[3][3] * b[3][5] | |
+ a[3][4] * b[4][5] | |
+ a[3][5] * b[5][5]; | |
c[4][0] = a[4][0] * b[0][0] | |
+ a[4][1] * b[1][0] | |
+ a[4][2] * b[2][0] | |
+ a[4][3] * b[3][0] | |
+ a[4][4] * b[4][0] | |
+ a[4][5] * b[5][0]; | |
c[4][1] = a[4][0] * b[0][1] | |
+ a[4][1] * b[1][1] | |
+ a[4][2] * b[2][1] | |
+ a[4][3] * b[3][1] | |
+ a[4][4] * b[4][1] | |
+ a[4][5] * b[5][1]; | |
c[4][2] = a[4][0] * b[0][2] | |
+ a[4][1] * b[1][2] | |
+ a[4][2] * b[2][2] | |
+ a[4][3] * b[3][2] | |
+ a[4][4] * b[4][2] | |
+ a[4][5] * b[5][2]; | |
c[4][3] = a[4][0] * b[0][3] | |
+ a[4][1] * b[1][3] | |
+ a[4][2] * b[2][3] | |
+ a[4][3] * b[3][3] | |
+ a[4][4] * b[4][3] | |
+ a[4][5] * b[5][3]; | |
c[4][4] = a[4][0] * b[0][4] | |
+ a[4][1] * b[1][4] | |
+ a[4][2] * b[2][4] | |
+ a[4][3] * b[3][4] | |
+ a[4][4] * b[4][4] | |
+ a[4][5] * b[5][4]; | |
c[4][5] = a[4][0] * b[0][5] | |
+ a[4][1] * b[1][5] | |
+ a[4][2] * b[2][5] | |
+ a[4][3] * b[3][5] | |
+ a[4][4] * b[4][5] | |
+ a[4][5] * b[5][5]; | |
c[5][0] = a[5][0] * b[0][0] | |
+ a[5][1] * b[1][0] | |
+ a[5][2] * b[2][0] | |
+ a[5][3] * b[3][0] | |
+ a[5][4] * b[4][0] | |
+ a[5][5] * b[5][0]; | |
c[5][1] = a[5][0] * b[0][1] | |
+ a[5][1] * b[1][1] | |
+ a[5][2] * b[2][1] | |
+ a[5][3] * b[3][1] | |
+ a[5][4] * b[4][1] | |
+ a[5][5] * b[5][1]; | |
c[5][2] = a[5][0] * b[0][2] | |
+ a[5][1] * b[1][2] | |
+ a[5][2] * b[2][2] | |
+ a[5][3] * b[3][2] | |
+ a[5][4] * b[4][2] | |
+ a[5][5] * b[5][2]; | |
c[5][3] = a[5][0] * b[0][3] | |
+ a[5][1] * b[1][3] | |
+ a[5][2] * b[2][3] | |
+ a[5][3] * b[3][3] | |
+ a[5][4] * b[4][3] | |
+ a[5][5] * b[5][3]; | |
c[5][4] = a[5][0] * b[0][4] | |
+ a[5][1] * b[1][4] | |
+ a[5][2] * b[2][4] | |
+ a[5][3] * b[3][4] | |
+ a[5][4] * b[4][4] | |
+ a[5][5] * b[5][4]; | |
c[5][5] = a[5][0] * b[0][5] | |
+ a[5][1] * b[1][5] | |
+ a[5][2] * b[2][5] | |
+ a[5][3] * b[3][5] | |
+ a[5][4] * b[4][5] | |
+ a[5][5] * b[5][5]; | |
} | |
fn test_matrix() { | |
let a: Mat = [ | |
[1, 2, 3, 4, 5, 6], | |
[7, 8, 9, 10, 11, 12], | |
[13, 14, 15, 16, 17, 18], | |
[19, 20, 21, 22, 23, 24], | |
[25, 26, 27, 28, 29, 30], | |
[31, 32, 33, 34, 35, 36], | |
]; | |
let b: Mat = [ | |
[37, 38, 39, 40, 41, 42], | |
[43, 44, 45, 46, 47, 48], | |
[49, 50, 51, 52, 53, 54], | |
[55, 56, 57, 58, 59, 60], | |
[61, 62, 63, 64, 65, 66], | |
[67, 68, 69, 70, 71, 72], | |
]; | |
let mut c: Mat = [[0; SIZE]; SIZE]; | |
matrix_multiply_unrolled(&a, &b, &mut c); | |
assert_eq!(c[0][0], 1197); | |
} | |
fn loop_test_matrix() { | |
for _ in 0..850 { | |
test_matrix(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment