Parallélisation simple
Il suffit d’un cargo add rayon
pour pouvoir faire ceci…
use rayon::prelude::*;
let [x, y] = [[2.4; 1024], [4.2; 1024]];
let dot = x.into_par_iter().zip(y)
.fold(|| 0.0,
|acc, (x, y)| x.mul_add(y, acc))
.sum();
…avec détection à la compilation des accès concurrents non protégés, bien sûr.
rayon
complète la bibliothèque standard avec des itérateurs parallèles.
Le fonctionnement est similaire à Intel TBB :
- Toute tâche parallélisable peut être coupée en deux parties ~égales.
- Avant de traiter une tâche, un thread la coupe en deux, met la moitié de côté.
- Un thread sans travail peut voler le travail laissé de côté par les autres threads.
Quand les threads sont assez “nourris”, l’exécution devient séquentielle.