Updated README, added rayon and tests for comparision

This commit is contained in:
Jack Yu 2021-04-30 19:24:15 -04:00
commit e36141a7cf
7 changed files with 308 additions and 0 deletions

41
src/bin/rayon_matmul.rs Normal file
View file

@ -0,0 +1,41 @@
use std::env;
use std::cmp::max;
use rand::random;
use std::time::Instant;
use rayon::prelude::*;
fn gen_matrix(nsize: usize) -> Vec<Vec<f64>> {
let mut ret = Vec::with_capacity(nsize);
for _ in 0..nsize {
let mut row = Vec::with_capacity(nsize);
for _ in 0..nsize {
row.push((random::<f64>() - 0.5) * 255.0);
}
ret.push(row);
}
ret
}
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <msize>", args[0]);
return;
}
let nsize = max(args[1].parse::<usize>().expect("Usage: matrix_mul <msize>"), 1);
let matrix = gen_matrix(nsize);
let timer = Instant::now();
let _result = (0..nsize).into_par_iter().map(|i| {
let mut res_row = Vec::with_capacity(nsize);
for j in 0..nsize {
let mut sum: f64 = 0.0;
for k in 0..nsize {
sum += matrix[i][k] * matrix[k][j];
}
res_row.push(sum);
}
res_row
}).collect::<Vec<Vec<f64>>>();
let interval = timer.elapsed();
println!("Elapsed time: {:?}", interval);
}

58
src/bin/rmp_matmul.rs Normal file
View file

@ -0,0 +1,58 @@
use std::env;
use std::cmp::max;
use rand::random;
use std::time::Instant;
use rustmp::{par_for, critical};
fn gen_matrix(nsize: usize) -> Vec<Vec<f64>> {
let mut ret = Vec::with_capacity(nsize);
for _ in 0..nsize {
let mut row = Vec::with_capacity(nsize);
for _ in 0..nsize {
row.push((random::<f64>() - 0.5) * 255.0);
}
ret.push(row);
}
ret
}
fn gen_empty(nsize: usize) -> Vec<Vec<f64>> {
let mut ret = Vec::with_capacity(nsize);
let mut row = Vec::with_capacity(nsize);
for _ in 0..nsize {
row.push(0 as f64);
}
for _ in 0..nsize {
ret.push(row.clone());
}
ret
}
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <msize>", args[0]);
return;
}
let nsize = max(args[1].parse::<usize>().expect("Usage: matrix_mul <msize>"), 1);
let matrix = gen_matrix(nsize);
let result = gen_empty(nsize);
let timer = Instant::now();
par_for! {
for i in 0..nsize, locked result, read matrix, {
for j in 0..nsize {
let mut sum = 0.0;
for k in 0..nsize {
sum += matrix[i][k] * matrix[k][j];
}
critical! {
readwrite result;
result[i][j] = sum;
}
}
}
}
let interval = timer.elapsed();
println!("Elapsed time: {:?}", interval);
}

51
src/bin/seqrs_matmul.rs Normal file
View file

@ -0,0 +1,51 @@
use std::env;
use std::cmp::max;
use rand::random;
use std::time::Instant;
fn gen_matrix(nsize: usize) -> Vec<Vec<f64>> {
let mut ret = Vec::with_capacity(nsize);
for _ in 0..nsize {
let mut row = Vec::with_capacity(nsize);
for _ in 0..nsize {
row.push((random::<f64>() - 0.5) * 255.0);
}
ret.push(row);
}
ret
}
fn gen_empty(nsize: usize) -> Vec<Vec<f64>> {
let mut ret = Vec::with_capacity(nsize);
let mut row = Vec::with_capacity(nsize);
for _ in 0..nsize {
row.push(0 as f64);
}
for _ in 0..nsize {
ret.push(row.clone());
}
ret
}
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <msize>", args[0]);
return;
}
let nsize = max(args[1].parse::<usize>().expect("Usage: matrix_mul <msize>"), 1);
let matrix = gen_matrix(nsize);
let mut result = gen_empty(nsize);
let timer = Instant::now();
for i in 0..nsize {
for j in 0..nsize {
let mut sum = 0.0;
for k in 0..nsize {
sum += matrix[i][k] * matrix[k][j];
}
result[i][j] = sum;
}
}
let interval = timer.elapsed();
println!("Elapsed time: {:?}", interval);
}