mirror of
https://github.com/xythrez/RustMP.git
synced 2025-09-03 13:22:35 +00:00
Updated README, added rayon and tests for comparision
This commit is contained in:
parent
db1fc0d3d3
commit
e36141a7cf
7 changed files with 308 additions and 0 deletions
41
src/bin/rayon_matmul.rs
Normal file
41
src/bin/rayon_matmul.rs
Normal 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
58
src/bin/rmp_matmul.rs
Normal 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
51
src/bin/seqrs_matmul.rs
Normal 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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue