Warum Rust diesen simplen Float-Loop nicht auto-vektorisiert
Trying to Make a Loop Auto-Vectorize
Ein Rust-Entwickler zeigt, warum der Compiler eine einfache Skalarprodukt-Schleife über f32-Arrays trotz SSE, AVX2 und FMA nicht vektorisiert: IEEE-754-Gleitkommaarithmetik ist nicht assoziiert, also darf der Compiler die Additionsreihenfolge nicht ändern. Erst eine manuelle 4er-Chunking-Variante bringt ihn dazu, addps und mulps zu nutzen – bleibt aber bei 128-Bit-Registern, selbst wenn 256-Bit verfügbar wären.
Das Hauptproblem hier ist, dass der Compiler Gleitkomma-Arithmetik nicht sicher umordnen kann, weil IEEE-754-Gleitkomma-Arithmetik nicht assoziativ ist, d. h. (a + b) + c ist nicht unbedingt gleich a + (b + c).