Skip to content

Instantly share code, notes, and snippets.

@alexxbb
Created March 4, 2020 04:25
Show Gist options
  • Save alexxbb/b7f4f0764ef8471d8a08254ed694c1ef to your computer and use it in GitHub Desktop.
Save alexxbb/b7f4f0764ef8471d8a08254ed694c1ef to your computer and use it in GitHub Desktop.
Rust rayon example
// 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