7 / 24 · Concepto
Anchura del acumulador, redondeo y saturación
¿Son suficientes dieciocho bits con signo para nueve productos int8 con signo y sesgo cero?
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
La acumulación necesita su propia anchura
Los operandos de ocho bits y una salida de ocho bits no implican un acumulador de ocho bits. Los códigos con signo de ocho bits tienen magnitud máxima 128. Con puntos cero cero y L términos, una cota conservadora de la magnitud de la suma es L×128×128 más la magnitud del sesgo. Elige una anchura con signo cuyo máximo positivo cubra esa cota; el bit de signo consume un bit.
Cálculo resuelto de anchura
Para C=3 y un núcleo 3×3, L=27. Cuando ambos operandos son −128, cada producto es +16384 y la suma es 442368. Diecinueve bits con signo llegan solo a 262143. Veinte bits llegan a 524287 y también cubren un margen de magnitud de sesgo de 1000, que da una cota de 443368. Intervalos de operandos más pequeños y demostrados pueden reducir la anchura necesaria, pero unas pocas entradas de prueba ordinarias no pueden demostrar una cota.
Los códigos sin signo con punto cero cero pueden llegar a 255, por lo que falla el supuesto de 128. Calcula primero A=max(abs(qmin−zx),abs(qmax−zx)) y el B análogo para los pesos. Usa L×A×B+abs(b). El propio centrado puede requerir más bits que el código almacenado.
Fija el orden de conversión de salida
El multiplicador es sx×sw/sy. Con multiplicador 0.5 y punto cero de salida 128, el acumulador nueve pasa al empate 4.5, se redondea al par cuatro y produce 132. El acumulador once redondea 5.5 a seis y produce 134. El acumulador −3 redondea −1.5 a −2. El truncamiento, el truncamiento hacia cero y el desplazamiento aritmético a la derecha difieren para los valores negativos. Los ejercicios usan una rutina específica de redondeo al más cercano con desempate al par, en lugar de la función predeterminada de redondeo del lenguaje.
Para una salida int8, el valor convertido 300 se satura a 127 y −300 a −128. Descartar los bits más significativos produciría valores modulares sin relación con los previstos. Registra los valores anteriores al recorte y el número de saturaciones. Incluye en el contrato la ubicación de ReLU y su representación del cero.
Verifica sumas positivas y negativas grandes, empates exactos, ambos límites de saturación y sesgos grandes. Contrasta deliberadamente una referencia ancha con un acumulador demasiado pequeño para revelar el desbordamiento. Nuestros datos ejecutables permanecen dentro del intervalo entero exacto de JavaScript; una referencia mayor también debe justificar la precisión de la aritmética del lenguaje anfitrión.
Inténtalo tú
¿Son suficientes dieciocho bits con signo para nueve productos int8 con signo y sesgo cero?
Leer la explicación
La cota positiva es 9×16384=147456, por encima del máximo de dieciocho bits, 131071. Diecinueve bits con signo llegan a 262143.