@@ -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)) {
171171reactor 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