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
16use rand::distributions::{IndependentSample, Range as RandRange};
18use rand::distributions::range::SampleRange;
19use num_traits::FromPrimitive;
20use ocl::OclScl;
21
22
23pub 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
34pub 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
57pub 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}