Created
March 4, 2020 04:25
-
-
Save alexxbb/b7f4f0764ef8471d8a08254ed694c1ef to your computer and use it in GitHub Desktop.
Rust rayon example
This file contains hidden or 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
// Parallel iterator over a contiguous array of i32 values given a raw pointer and size; | |
use rayon::prelude::*; | |
fn var_1(ptr: *mut i32, len: usize) { | |
// With a stdlib slice | |
let data_sl = unsafe { std::slice::from_raw_parts_mut(ptr, len) }; | |
data_sl.into_par_iter().for_each(|i| *i *= *i); | |
} | |
fn var_2(ptr: *mut i32, len: usize) { | |
// With pointer arithmetic. We have to wrap the raw pointer in a Sync'able struct. | |
#[derive(Debug)] | |
struct Wrap(*mut i32); | |
unsafe impl std::marker::Sync for Wrap{} | |
let w = Wrap(ptr); | |
(0..len).into_par_iter().for_each(|i|{ | |
unsafe { | |
let cp = (&w).0.add(i); | |
*cp *= *cp; | |
} | |
}); | |
} | |
fn main() { | |
let args:Vec<String> = std::env::args().collect(); | |
let len = args.get(1).and_then(|v| v.parse::<i32>().ok()).expect("Must provide data size"); | |
let mut data: Vec<i32> = (0..len).collect(); | |
let ptr = data.as_mut_ptr(); | |
let start = std::time::Instant::now(); | |
var_1(ptr, len as usize); | |
var_2(ptr, len as usize); | |
println!("Time: {}ms", method, start.elapsed().as_millis()); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment