Rust 컴파일러가 float 루프를 auto-vectorize하지 못하는 이유
Trying to Make a Loop Auto-Vectorize
Rust 1.98.0으로 컴파일한 float 배열 내적 함수가 auto-vectorize되지 않는 현상을 분석한다. IEEE 754 부동소수점 연산은 결합법칙이 성립하지 않아 컴파일러가 덧셈 순서를 재배치할 수 없기 때문이다. 정수 버전은 즉시 vectorize되지만, float 버전은 수동으로 4개씩 청크 처리해야 128-bit SIMD로 vectorize된다. AVX2+FMA를 켜도 256-bit 벡터를 활용하지 못하고, FMA의 반올림 차이 때문에 FMA 명령도 쓰지 않는다.
컴파일러가 안전하게 부동소수점 연산 순서를 재배치할 수 없는 주된 이유는 IEEE 754 부동소수점 연산이 결합법칙을 따르지 않기 때문이다. 즉, (a + b) + c가 a + (b + c)와 반드시 같지는 않다.