ASM51 • Exibir tópico - Multiplização por Hardware
Multiplização por Hardware
por Cefas » 30 Mar 2013 15:42
Estou começando a gora a trabalhar com DPS e a maioria das literaturas que já li, fala da famigerada Multiplicação por Hw.
Com um olhar diferente, do que se trata essa máquina, tipo qual é o Hardware empregado para realizar isso?
Quais componentes da eletrônica são utilizados para se fazer isso?
Registrado em: 26 Dez 2011 19:47
Re: Multiplização por Hardware
por Rodrigo_P_A » 30 Mar 2013 19:10
Cefas escreveu: Olá Pessoal
Eu não entendo a fundo, mas como o próprio nome diz, faz multiplicação por Hw, geralmente dá um resultado da multiplicação de dois numeros de 32 bits em um de 64bits em um único ciclo.
Dá uma olhada nas implementações desse tipo de hw em FPGA:
http://www.fpga-guru.com/multipli.htm
Dá pra vc ter uma idéia de como as coisas funcionam.
o HW empregado é um HW dedicado que faz a multiplicação, como tudo em eletrônica digital e microprocessadores: portas lógicas, flips flops, num tem mágica não!
por marcelo_asm » 02 Abr 2013 14:18
embora a multiplicação seja bem exigente em termos de processamento, bem pior é a divisão. Algumas aplicações com divisões são quase inviáveis sem uma FPU dedicada.
por msamsoniuk » 04 Abr 2013 20:46
a ideia do multiplicador por hardware eh otimizar o processamento de filtros para processamento de sinal e consiste nao apenas em um multiplicador, mas em uma operacao multiplica-e-acumula (MAC). a ideia de ser em hardware e rodar em um clock eh justamente permitir vc prever e dimensionar a capacidade de execucao. por exemplo, para um gerador de RF simples, como descrito adiante, uma unica operacao MAC seria necessaria. portanto, se um DSP consegue uma performance de 400 MMAC/s, entao o meu filtro vai rodar a taxa de 400 Msamples/s.
mas na pratica a coisa pode nao ser tao simples!
por exemplo, eu estava trabalhando em um codigo verilog para sintetizar portadoras de RF em frequencias arbitrarias:
input RES,
input [7:0] AFREQ,
input signed [7:0] KFREQ,
input signed [7:0] KAMPL,
output signed [7:0] OUT
wire signed [7:0] X0;
wire signed [7:0] KZERO;
reg signed [7:0] X1;
reg signed [7:0] X2;
reg signed [7:0] K1;
reg signed [7:0] KX [0:255];
assign KZERO = 0;
assign X0 = K1-X2;
assign OUT = X2;
X1 <= RES ? KZERO : X0;
X2 <= RES ? KAMPL : X1;
K1 <= RES ? KZERO : KX[X0+128];
KX[AFREQ] <= KFREQ;
ele sintetiza com um sampling rate de ateh 266MHz em uma FPGA barata. a grosso modo, eu estimo que ele possa gerar frequencias entre 1 e 66MHz.
bom, o ponto forte eh o filtro ali no meio... ignorando os valores iniciais, eh como um loop infinito:
X0 = K1-X2;
K1 = KX[X0+128];
aquele KX[] na realidade essa eh uma forma de acelerar uma multiplicacao atraves de uma lookup table. com a multiplicacao seria algo como:
X0 = K*X1-X2
onde K eh o coeficiente que determina a frequencia e eh continuamente multiplicado pelo valor de X1 e subtraido de X2 e consiste em uma operacao MAC.
bom, minha primeira abordagem foi partir diretamente p/ um multiplicador de hardware, porem a coisa nao funcionou tao bem como eu esperava. o primeiro problema eh que para atingir altissima velocidade eu preciso adicionar pipelines no multiplicador. assim, embora eu tenha um delay de 3 clocks no processamento, eu posso usar um clock maior e, na pratica, eu vou ter uma multiplicacao por clock na saida.
o problema eh que o filtro tem realimentacao: os resultados futuros dependem dos resultados passados. outro problema eh que, embora eu tenha capacidade de mais de 1GMAC/s, essa performance esta espalhada em 4 multiplicadores. mas novamente, como os resultados futuros dependem dos resultados passados, eu nao consigo pensar em uma forma de paralelizar o stream para aproveitar essa performance.
a solucao foi usar uma lookup table: ela entrega uma multiplicacao pre-calculada k*x para k constante a cada clock e sem usar pipelines. a desvantagem eh a velocidade de setup: precisa de 256 clocks durante o reset para inicializar a lookup table. se fosse com multiplicador, o setup seria instantaneo, permitindo mudar a frequencia em apenas um clock.
bom, um detalhe interessante: os coeficientes geralmente sao valor do tipo 1/c. entao, de certa forma, estamos fazendo divisoes. porem todos os termos sao multiplicados por algum fator fixo, de modo que a divisao se torne inteiro, ou seja, ao inves de fazer x/c, que seria trabalhoso e daria uma serie de problemas, fazemos (x*k)>>h, onde k = (2^h)/c. normalmente esse shift pode ser feito sem penalidade de performance e a conversao do coeficiente pode ser feita previamente. o resultado eh que trocamos a divisao por uma multiplicacao, que eh mais eficiente.
por tcpipchip » 05 Abr 2013 11:28
eu nao sei nada
por MOR_AL » 06 Abr 2013 15:39
Tinha uns chips que efetuavam a multiplicação para 4 bits. (DM7875A/8875A e DM7875B/8875B).
Dê uma pesquisada, talvez encontre algo de seu interesse.
por msamsoniuk » 07 Abr 2013 00:35
tcpipchip escreveu: eu nao sei nada
eh q os processadores da tua epoca soh somavam e subtraiam hehehe
por RobL » 17 Abr 2013 11:40
Os antigos somavam e subtraiam ? Creio que os mais atuais só somam, tal como antes !!!
Existe alguma operação além da soma ?
por ELFS » 18 Abr 2013 12:59
Outro exemplo pega um não muito antigo 386SX com cooprocessador matematico, a multiplicação por HW so migrou para o processador nos micros da linha 386 e 486 DX e os pentium já nasceram com eles. Concluindo muitos microcontroladores ainda estão lá no tempo do 386SX.
por msamsoniuk » 28 Abr 2013 12:05
RobL escreveu: Os antigos somavam e subtraiam ? Creio que os mais atuais só somam, tal como antes !!!
nah, pensa soh, em plena era CISC, usar NEG/ADD seria deselegante! huahuahua
no 68000, por exemplo, tinha um universo de operacoes de utilidade duvidosa:
ABCD = add em BCD
ADD = add normal
ADDI = add com operando imediato de 8, 16 ou 32 bits
ADDQ = add com operando de 3 bits (equivalente ao INC, as com valores entre 1 e
ADDA = add entre enderecos de 16 ou 32 bits, com extensao de 16 bits para 32 bits
ADDX = add com extensao
e as equivalentes SUB*, alem de MULU/MULS e DIVU/DIVS, para multiplicacao e divisao com e sem sinal!