ocl_extras/
lib.rs

1extern crate ocl;
2extern crate rand;
3extern crate num_traits;
4extern crate futures;
5#[macro_use] extern crate failure;
6
7pub mod sub_buffer_pool;
8pub mod command_graph;
9pub mod work_pool;
10pub mod full_device_info;
11
12pub use self::sub_buffer_pool::SubBufferPool;
13pub use self::command_graph::{CommandGraph, Command, CommandDetails, KernelArgBuffer, RwCmdIdxs};
14pub use self::work_pool::WorkPool;
15
16// use rand;
17use rand::distributions::{IndependentSample, Range as RandRange};
18use rand::distributions::range::SampleRange;
19use num_traits::FromPrimitive;
20use ocl::OclScl;
21
22
23/// Returns a vector with length `size` containing random values in the (half-open)
24/// range `[vals.0, vals.1)`.
25pub fn scrambled_vec<T: OclScl + SampleRange>(vals: (T, T), size: usize) -> Vec<T> {
26    assert!(size > 0, "\nbuffer::shuffled_vec(): Vector size must be greater than zero.");
27    assert!(vals.0 < vals.1, "\nbuffer::shuffled_vec(): Minimum value must be less than maximum.");
28    let mut rng = rand::weak_rng();
29    let range = RandRange::new(vals.0, vals.1);
30
31    (0..size).map(|_| range.ind_sample(&mut rng)).take(size as usize).collect()
32}
33
34/// Returns a vector with length `size` which is first filled with each integer value
35/// in the (inclusive) range `[vals.0, vals.1]`. If `size` is greater than the
36/// number of integers in the aforementioned range, the integers will repeat. After
37/// being filled with `size` values, the vector is shuffled and the order of its
38/// values is randomized.
39pub fn shuffled_vec<T: OclScl>(vals: (T, T), size: usize) -> Vec<T> {
40    let mut vec: Vec<T> = Vec::with_capacity(size);
41    assert!(size > 0, "\nbuffer::shuffled_vec(): Vector size must be greater than zero.");
42    assert!(vals.0 < vals.1, "\nbuffer::shuffled_vec(): Minimum value must be less than maximum.");
43    let min = vals.0.to_i64().expect("\nbuffer::shuffled_vec(), min");
44    let max = vals.1.to_i64().expect("\nbuffer::shuffled_vec(), max") + 1;
45    let mut range = (min..max).cycle();
46
47    for _ in 0..size {
48        vec.push(FromPrimitive::from_i64(range.next().expect("\nbuffer::shuffled_vec(), range"))
49            .expect("\nbuffer::shuffled_vec(), from_usize"));
50    }
51
52    shuffle(&mut vec);
53    vec
54}
55
56
57/// Shuffles the values in a vector using a single pass of Fisher-Yates with a
58/// weak (not cryptographically secure) random number generator.
59pub fn shuffle<T: OclScl>(vec: &mut [T]) {
60    let len = vec.len();
61    let mut rng = rand::weak_rng();
62    let mut ridx: usize;
63    let mut tmp: T;
64
65    for i in 0..len {
66        ridx = RandRange::new(i, len).ind_sample(&mut rng);
67        tmp = vec[i];
68        vec[i] = vec[ridx];
69        vec[ridx] = tmp;
70    }
71}