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.