7 / 24 · Conceito
Largura do acumulador, arredondamento e saturação
Dezoito bits com sinal são suficientes para nove produtos int8 com sinal e viés zero?
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
A acumulação precisa de sua própria largura
Operandos de oito bits e uma saída de oito bits não implicam um acumulador de oito bits. Códigos com sinal de oito bits têm módulo máximo 128. Com pontos zero iguais a zero e L termos, um limite conservador para o módulo da soma é L×128×128, mais o módulo do viés. Escolha uma largura com sinal cujo máximo positivo cubra esse limite; o bit de sinal ocupa um bit.
Cálculo de largura resolvido
Para C=3 e um kernel 3×3, L=27. Quando ambos os operandos são −128, cada produto é +16384 e a soma é 442368. Dezenove bits com sinal chegam apenas a 262143. Vinte bits chegam a 524287 e também cobrem uma margem de módulo do viés de 1000, dando o limite 443368. Faixas menores dos operandos, comprovadas, podem reduzir a largura necessária, mas algumas entradas comuns de teste não comprovam um limite.
Códigos sem sinal com ponto zero igual a zero podem chegar a 255, portanto a premissa de 128 falha. Primeiro, calcule A=max(abs(qmin−zx),abs(qmax−zx)) e o B análogo para os pesos. Use L×A×B+abs(b). A própria centralização pode exigir mais bits do que o código armazenado.
Defina a ordem da conversão de saída
O multiplicador é sx×sw/sy. Com multiplicador 0.5 e ponto zero de saída 128, o acumulador nove torna-se o empate 4.5, arredonda para o par quatro e produz 132. O acumulador onze arredonda 5.5 para seis e produz 134. O acumulador −3 arredonda −1.5 para −2. Truncamento, truncamento em direção a zero e deslocamento aritmético à direita diferem para valores negativos. Os exercícios usam uma rotina dedicada de arredondamento para o par mais próximo em vez da função padrão de arredondamento da linguagem.
Para saída int8, o valor convertido 300 satura em 127 e −300 em −128. Descartar os bits mais significativos causaria comportamento modular com valores sem relação com os originais. Registre os valores antes da limitação e a quantidade de saturações. Inclua no contrato a posição de ReLU e sua representação de zero.
Verifique somas positivas e negativas grandes, empates exatos, ambos os limites de saturação e viés grande. Compare deliberadamente uma referência ampla com um acumulador subdimensionado para revelar overflow. Nossos dados executáveis de teste permanecem na faixa exata de inteiros de JavaScript; uma referência maior também deve justificar a precisão da aritmética da linguagem em que é executada.
Experimente
Dezoito bits com sinal são suficientes para nove produtos int8 com sinal e viés zero?
Ler a explicação
O limite positivo é 9×16384=147456, acima do máximo de dezoito bits, 131071. Dezenove bits com sinal chegam a 262143.