Produit scalaire optimisé

On peut gagner encore un facteur ≤ 2 en tirant parti du FMA (fused multiply-add) :

#![allow(unused)]
fn main() {
type Vector = f32;
let x = [2.4f32; 1024];
let y = [4.2; 1024];
let dot = x.into_iter().zip(y)
           .fold(Vector::default(),
                 |acc, (x, y)| x.mul_add(y, acc));
}

Et un peu de parallélisme d’instructions plus tard, on obtient des performances satisfaisantes1 :

Comparatif de méthodes de produit scalaire

1

Le speedup FMA est assez loin de 2x pour la même raison qu’AVX-512 avant : calcul trop simple…