Компилятор 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).

Ещё за этот день

2026-09-14