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 !
1
Cf slide 23 de cette présentation de Pierre.