BookinglyTech News
Hardware

Los números subnormales hunden el rendimiento de los Xeon, pero AMD y ARM se libran

Un banco de pruebas en C++ sobre cinco procesadores mide el coste real de operar con números en coma flotante subnormales: hasta 50 veces más lento en Intel, sin efecto apreciable en Zen 5, Graviton 5 y Apple M4.

3 min de lecturaLobsters0 vistas

Los números subnormales en coma flotante siguen saliendo caros de calcular, pero solo en Intel. Daniel Lemire ha medido el coste con un banco de pruebas en C++ sobre cinco procesadores y la diferencia entre arquitecturas es de otro orden: en un Xeon, multiplicar cuando hay un subnormal de por medio es entre 45 y 50 veces más lento que hacerlo con números normales, mientras que en AMD Zen 5 y en los ARM recientes la penalización es nula o marginal.

El montaje es sencillo y está pensado para que el compilador pueda autovectorizar: arrays de 16384 valores, que caben en caché, con varios kernels encima. Multiplicar cada elemento por 0,75, sumar dos arrays, dividir por 3, multiplicar valores normales por una constante minúscula (2^−1030) para que la entrada sea normal y la salida subnormal, y una cadena dependiente en la que cada multiplicación espera a la anterior, con x *= 0,9999 repetido 16384 veces. Cada kernel se ejecuta con entradas normales en [0,5, 1), con entradas subnormales, y con entradas normales donde uno de cada cien valores es subnormal. Todo compilado con GCC 15 y -O3 -march=native en Linux, Apple clang 17 en macOS y una comprobación con clang 21 en Linux.

Intel: la penalización se contagia

En el Xeon 6975P-C (Granite Rapids) la multiplicación pasa de 0,17 a 8,35 nanosegundos por elemento, y la división de 0,51 a 9,38. La cadena dependiente escala de 0,77 a 32,69 ns por paso: una multiplicación normal tarda 4 ciclos de latencia, y con un subnormal se va a 128. En el Xeon Gold 6548N (Emerald Rapids) los números son casi idénticos: 0,21 frente a 9,25 en la multiplicación.

Da igual si el subnormal es la entrada o el resultado. Multiplicar valores normales para obtener un subnormal cuesta lo mismo que multiplicar subnormales. La excepción son las sumas y las restas, que van a plena velocidad. Y con solo un 1% de valores subnormales el castigo ya se nota (0,44 ns frente a 0,17 en la multiplicación), porque al vectorizar un único valor contaminado arrastra el bloque entero de operaciones.

AMD y ARM no lo notan

En el EPYC 9R45 (Zen 5) la multiplicación se queda en 0,07 frente a 0,08 ns, y la división sube de 0,11 a 0,25: el doble. La cadena dependiente pasa de 0,66 a 0,88 ns, un tercio más lenta, porque al multiplicador le hace falta un ciclo extra. En las divisiones, tener un solo subnormal de cada cien valores (0,24 ns) sale casi tan caro como tenerlos todos (0,25 ns).

El Graviton 5, con núcleo Arm Neoverse V3, y el Apple M4 Max no se inmutan: mismos tiempos con normales que con subnormales en todos los kernels.

Para quien haga cálculo numérico con recortes de exponente, la lectura es directa: en hardware Intel los subnormales continúan siendo un problema de rendimiento real y el remedio pasa por evitarlos, como ya hacen parte del mundo del machine learning y de los gráficos. En AMD y ARM la preocupación pierde sentido. El código del banco de pruebas está publicado.