Skip to content

Commit cdc2338

Browse files
committed
Fix matmul
1 parent 17b6e51 commit cdc2338

File tree

2 files changed

+36
-37
lines changed

2 files changed

+36
-37
lines changed

Rust/Savina/src/lib/matrix.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ impl<T> Matrix<T> {
5353
pub fn set(&mut self, x: usize, y: usize, value: T) {
5454
self.data[x * self.size_y + y] = value;
5555
}
56+
57+
pub fn transpose(self) -> TransposedMatrix<T> {
58+
TransposedMatrix(self)
59+
}
5660
}
5761

5862
pub fn matrix_sum<T>(matrices: &[Matrix<T>]) -> Matrix<T>

Rust/Savina/src/parallelism/MatMul.lf

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,29 @@ reactor Manager(numWorkers: usize(20), dataLength: usize(1024)) {
4444
state num_workers(numWorkers);
4545
state data_length(dataLength);
4646

47-
state A: Arc<Matrix<f64>>;
48-
state B: Arc<TransposedMatrix<f64>>;
47+
preamble {=
48+
#[derive(Clone)]
49+
pub struct Data(pub Arc<Matrix<f64>>, pub Arc<TransposedMatrix<f64>>, pub Weak<Mutex<Matrix<f64>>>);
50+
=}
51+
52+
state A: Arc<Matrix<f64>>({= {
53+
let mut a = Matrix::<f64>::new(data_length, data_length);
54+
for i in 0..data_length {
55+
for j in 0..data_length {
56+
a.set(i, j, i as f64);
57+
}
58+
}
59+
Arc::new(a)
60+
} =});
61+
state B: Arc<TransposedMatrix<f64>>({= {
62+
let mut a = TransposedMatrix::<f64>::new(data_length, data_length);
63+
for i in 0..data_length {
64+
for j in 0..data_length {
65+
a.set(i, j, j as f64);
66+
}
67+
}
68+
Arc::new(a)
69+
} =});
4970
state C: {= Vec<Arc<Mutex<Matrix<f64>>>> =}
5071

5172
state workQueue: VecDeque<WorkItem>;
@@ -56,31 +77,10 @@ reactor Manager(numWorkers: usize(20), dataLength: usize(1024)) {
5677
input start: unit;
5778
output finished: unit;
5879

59-
output[numWorkers] data: {=(Arc<Matrix<f64>>, Arc<TransposedMatrix<f64>>, Weak<Mutex<Matrix<f64>>>)=};
80+
output[numWorkers] data: Data;
6081
output[numWorkers] doWork: WorkItem;
6182
input[numWorkers] moreWork: {=[WorkItem; 8]=};
6283

63-
reaction(startup) {=
64-
// Fill both input arrays with data
65-
let (a, b) = {
66-
let mut a = Matrix::<f64>::new(self.data_length, self.data_length);
67-
let mut b = TransposedMatrix::<f64>::new(self.data_length, self.data_length);
68-
69-
for i in 0..self.data_length {
70-
for j in 0..self.data_length {
71-
a.set(i, j, i as f64);
72-
b.set(i, j, j as f64);
73-
}
74-
}
75-
76-
(Arc::new(a), Arc::new(b))
77-
};
78-
79-
self.A = a;
80-
self.B = b;
81-
self.C = Vec::new();
82-
=}
83-
8484
reaction(start) -> data, next {=
8585
// reset the result matrix C
8686
for _ in 0..self.num_workers {
@@ -89,7 +89,7 @@ reactor Manager(numWorkers: usize(20), dataLength: usize(1024)) {
8989

9090
// send pointers to all 3 matrixes to the workers
9191
for (d, c) in data.into_iter().zip(&self.C) {
92-
ctx.set(d, (Arc::clone(&self.A), Arc::clone(&self.B), Arc::downgrade(&c)));
92+
ctx.set(d, Data(Arc::clone(&self.A), Arc::clone(&self.B), Arc::downgrade(&c)));
9393
}
9494

9595
// produce the first work item, instructing the worker to multiply the complete matrix
@@ -171,11 +171,9 @@ reactor Manager(numWorkers: usize(20), dataLength: usize(1024)) {
171171
reactor Worker(threshold: usize(16384)) {
172172
state threshold(threshold);
173173

174-
state A: Arc<Matrix<f64>>;
175-
state B: Arc<TransposedMatrix<f64>>;
176-
state C: Weak<Mutex<Matrix<f64>>>;
174+
state data_ref: Option<super::manager::Data>;
177175

178-
input data: {=(Arc<Matrix<f64>>, Arc<TransposedMatrix<f64>>, Weak<Mutex<Matrix<f64>>>)=};
176+
input data: super::manager::Data;
179177
input doWork: WorkItem;
180178
output moreWork: {=[WorkItem; 8]=};
181179

@@ -186,11 +184,7 @@ reactor Worker(threshold: usize(16384)) {
186184
=}
187185

188186
reaction (data) {=
189-
ctx.use_ref_opt(data, |(a, b, c)| {
190-
self.A = a.clone();
191-
self.B = b.clone();
192-
self.C = c.clone();
193-
});
187+
self.data_ref = ctx.use_ref_opt(data, Clone::clone);
194188
=}
195189

196190
reaction(doWork) -> moreWork {=
@@ -214,18 +208,19 @@ reactor Worker(threshold: usize(16384)) {
214208
work_queue[7] = WorkItem{srA: wi.srA + dim, scA: wi.scA + dim, srB: wi.srB + dim, scB: wi.scB + dim, srC: wi.srC + dim, scC: wi.scC + dim, numBlocks, dim};
215209

216210
ctx.set(moreWork, work_queue);
217-
} else {
211+
} else if let Some(super::manager::Data(a, b, c)) = &self.data_ref {
212+
218213
// otherwise we compute the result directly
219214
let end_r = wi.srC + wi.dim;
220215
let end_c = wi.scC + wi.dim;
221216

222-
let upgraded = self.C.upgrade().unwrap();
217+
let upgraded = c.upgrade().unwrap();
223218
let mut c = upgraded.lock().unwrap();
224219

225220
for i in wi.srC..end_r {
226221
for j in wi.scC..end_c {
227222
for k in 0..wi.dim {
228-
let mut v = self.A.get(i, wi.scA + k) * self.B.get(wi.srB + k, j);
223+
let mut v = a.get(i, wi.scA + k) * b.get(wi.srB + k, j);
229224
v += c.get(i, j);
230225
c.set(i, j, v);
231226
}

0 commit comments

Comments
 (0)