Ponto flutuante customizado

Estudos avançados

A Parte V pressupõe os tutoriais das Partes II e III. O conteúdo daqui em diante é voltado à pós-graduação.

No SAPHO, o formato de ponto flutuante é um parâmetro de projeto. Em vez de aceitar o IEEE 754 de 32 bits, você escolhe quantos bits de mantissa e de expoente o seu problema pede, e o hardware é gerado exatamente nesse tamanho. Menos bits, menos células, mais frequência; a troca é precisão.

O formato

Uma palavra float de NUBITS bits se divide em três campos:

[ sinal: 1 ][ expoente: NBEXPO ][ mantissa: NBMANT ]

com o valor dado por \((-1)^{sinal} \times mantissa \times 2^{expoente}\). As diferenças para o IEEE 754, todas deliberadas, todas baratas em hardware:

SAPHO

IEEE 754

Mantissa

inteiro sem bit implícito

fração com 1 implícito

Expoente

complemento de dois, sem viés

com viés

Sinal

sinal e magnitude

sinal e magnitude

NaN, infinitos, subnormais

não existem

existem

A regra estrutural que o Hub impõe vem daqui: NUBITS = NBMANT + NBEXPO + 1, um bit para cada campo, sem sobra.

Faixa e precisão

  • Maior magnitude: \((2^{NBMANT} - 1) \cdot 2^{2^{NBEXPO-1}-1}\)

  • Menor magnitude não nula: \(2^{-2^{NBEXPO-1}}\)

  • Precisão relativa: cerca de \(NBMANT \cdot \log_{10} 2\) dígitos decimais

Configurações de referência:

NUBITS

NBMANT

NBEXPO

Comparável a

16

10

5

meia precisão

23

16

6

o padrão do Hub

32

23

8

precisão simples IEEE em bits

Dimensionando para o seu problema

O procedimento honesto é experimental:

  1. Estime a faixa dinâmica do sinal (o expoente cuida dela) e a precisão exigida (a mantissa cuida dela).

  2. Gere o processador com a configuração candidata.

  3. Compile: toda constante que não cabe exatamente no formato gera um aviso com o erro de representação. Leia esses avisos; eles são o primeiro veredito.

  4. Simule e compare as saídas com um modelo de referência (um script Python com o mesmo algoritmo em dupla precisão, por exemplo).

Vendo o erro de arredondamento na onda

Na simulação com Icarus, o processador expõe dois sinais didáticos: delta_float e delta_int, o erro de arredondamento cometido em cada operação da ULA, calculado contra o valor exato. Adicione-os na configuração de ondas e observe o erro se acumulando ao longo de um laço: é a aula de análise numérica acontecendo no seu próprio circuito.

Forma de onda com o sinal delta_float mostrando o erro por operação.
Hub de Processadores com uma configuração de 32 bits.

Figura 16 Para comparar formatos, gere dois processadores iguais mudando apenas mantissa e expoente, rode o mesmo estímulo e compare os output_N.txt.

O custo em hardware

As operações de soma, multiplicação e divisão em ponto flutuante têm blocos dedicados na ULA, instanciados apenas se o programa as usa. As funções matemáticas (sqrt, exp, trigonométricas) não têm bloco: viram rotinas de software sobre essas operações básicas, e o custo delas é tempo de execução, não área. O relatório do TASM mostra as duas coisas.