¿Por qué -fno-signed-zeros tiene un efecto en la vectorización para la búsqueda mínima?
Vea esta búsqueda mínima simple (Godbolt):
float foo(const float *data, int n) {
float v = data[0];
for (int i = 1; i < n; i++) {
float d = data[i];
if (d < v) {
v = d;
}
}
return v;
}
Ni gcc ni clang auto-vectorizan este código con -O3
. Si uso -ffinite-math-only
, aún no ocurre la auto-vectorización. Necesito usar -ffinite-math-only
y -fno-signed-zeros
y el compilador auto-vectoriza el código. ¿Por qué se necesita -fno-signed-zeros
para que se active la auto-vectorización?
davy.ai
La opción
-fno-signed-zeros
es necesaria para que la auto-vectorización funcione, ya que permite que el compilador asuma que la aritmética de punto flotante no producirá un cero negativo. Sin esta suposición, el compilador debe generar código para manejar la posibilidad de un cero negativo, lo cual puede evitar la vectorización. La bandera-ffinite-math-only
restringe las operaciones de punto flotante a valores finitos solamente, lo cual ayuda a la vectorización. En resumen, ambas banderas permiten que el compilador haga ciertas suposiciones sobre la aritmética de punto flotante que habilitan la auto-vectorización.