Produit scalaire simple
Intuitivement, il suffirait de combiner zip()
, map()
et sum()
…
#![allow(unused)] fn main() { let x = [2.4; 1024]; let y = [4.2; 1024]; let dot = x.into_iter().zip(y) .map(|(x, y)| x * y) .sum::<f32>(); println!("{dot}"); }
…mais on a vu que sum()
n’est pas optimal en virgule flottante !
Et as_simd()
n’aidera pas ici car il y a deux entrées x
et y
d’alignement a priori distinct.
La solution ? Basculer vers un format de données nativement SIMD (et donc bien aligné) :
type Vector = Simd<f32, 8>;
let x = [Vector::splat(2.4); 1024 / 8];
let y = [Vector::splat(4.2); 1024 / 8];
// ... et on calcule comme précédemment ...