Réduction SIMD: Le futur

On peut tester dans la version nightly de rustc le prototype de std::simd :

use std::simd::prelude::*;

// Données d'entrée
let input = [4.2; 1024];

// Extraction de la portion alignée des données d'entrée
let (peel, body, tail): (&[f32], &[Simd<f32, LANES>], &[f32]) =
    input.as_simd::<LANES>();

// Somme de la portion alignée
let body_sum = body.iter()
                   .sum::<Simd<f32, LANES>>()  // Somme de vecteurs SIMD
                   .reduce_sum();              // Réduction à un scalaire unique

// Somme complète
let sum = peel.iter()                             // Scalaires avant portion alignée
              .chain(std::iter::once(&body_sum))  // Somme de la portion alignée
              .chain(tail.iter())                 // Scalaires après portion alignée
              .sum::<f32>();

Et si on ajoute un peu de parallélisme d’instructions1, on atteint la performance crète HW !