Компилятор Rust отказывается векторизовать цикл: виновата ассоциативность чисел с плавающей точкой
Trying to Make a Loop Auto-Vectorize
Автор разбирает, почему простой цикл вычисления скалярного произведения на Rust не векторизуется автоматически. Оказывается, компилятор не может переупорядочить операции сложения float из-за неассоциативности IEEE 754. Включение AVX2+FMA не помогает, а ручное разбиение на блоки по 4 элемента даёт векторизацию, но только 128-битную, даже когда доступны 256-битные регистры. Целочисленная версия функции векторизуется без проблем.
Главная проблема здесь в том, что компилятор не может безопасно переупорядочивать операции арифметики с плавающей точкой, потому что арифметика IEEE 754 не ассоциативна, то есть (a + b) + c не обязательно равно a + (b + c).