Sto provando ad accelerare un calcolo costoso su un vettore di grandi dimensioni utilizzando thread. La mia funzione consuma un vettore, calcola un vettore di nuovi valori (non aggrega, ma l'ordine di input deve essere mantenuto) e lo restituisce. Tuttavia, sto cercando di capire come generare i thread, assegnare fette vettoriali a ciascuno, quindi raccogliere e combinare i risultati.Consumare porzioni di vettore non sovrapposte e combinare i risultati
// tunable
const NUMTHREADS: i32 = 4;
fn f(val: i32) -> i32 {
// expensive computation
let res = val + 1;
res
}
fn main() {
// choose an odd number of elements
let orig = (1..14).collect::<Vec<i32>>();
let mut result: Vec<Vec<i32>> = vec!();
let mut flat: Vec<i32> = Vec::with_capacity(orig.len());
// split into slices
for chunk in orig.chunks(orig.len()/NUMTHREADS as usize) {
result.push(
chunk.iter().map(|&digit|
f(digit)).collect()
);
};
// flatten result vector
for subvec in result.iter() {
for elem in subvec.iter() {
flat.push(elem.to_owned());
}
}
println!("Flattened result: {:?}", flat);
}
Il calcolo filettata dovrebbe prendere tra for chunk…
e // flatten …
, ma non può trovare molti semplici esempi di fili deposizione x, assegnando pezzi in sequenza, e restituendo il vettore appena calcolato dal filo e in un contenitore in modo che possa essere appiattito. Devo avvolgere orig.chunks()
in un Arc
e afferrare manualmente ogni blocco in un ciclo? Devo passare f
in ogni thread? Dovrò usare un B-Tree per garantire che l'ordine di input e output corrisponda? Posso usare solo simple_parallel
?