Qual a velocidade de multiplicação ou divisão de 64 bits em um FPGA?

8

Ao usar um FPGA comum, como o Xilinx Spartan 3 ou o Virtex 5, quantos ciclos são necessários para executar uma multiplicação ou divisão de 64 bits de ponto flutuante de precisão dupla?

Pelo que entendi, o FPGA não possui um FPU rígido e você precisa criar um usando as bibliotecas IEEE padrão ou outros materiais. Isso significa que ele não será executado em um único ciclo, por isso estou procurando uma estimativa aproximada para comparar o desempenho de uma CPU de 100 Mhz com um FPGA Spartan / Virtex de 100 MHz.

Estou interessado principalmente em operadores de ponto flutuante, mas se você tiver experiência com operações inteiras, isso também seria apreciado.

O Flash
fonte
3
Primeiro, vale esclarecer a pergunta: você fala sobre MPY / divisão de 64 bits, o que implicaria multiplicar / dividir números inteiros de 64 bits - depois você menciona a FPU, que implica ponto flutuante de precisão dupla. Detalhes da resposta será diferente para cada ...
Brian Drummond
2
Para uma multiplicação de cada vez, o tempo é provavelmente comparável ou ligeiramente a favor da CPU. Obviamente, a vantagem do FPGA é que você pode ter muitos deles em paralelo.
Pjc50

Respostas:

12

Eu não fiz isso para o FP de precisão dupla, mas os mesmos princípios se aplicam à precisão única, para a qual eu implementei a divisão (multiplicada por recíproca).

O que esses FPGAs têm, em vez de FPUs, são blocos DSP / multiplicadores conectados, capazes de implementar uma multiplicação 18 * 18 ou (Virtex-5) 18 * 25 em um único ciclo. E os dispositivos maiores têm cerca de mil deles, ou mesmo 126 ou 180, na extremidade superior das famílias Spartan-3 ou Spartan-6.

Assim, você pode decompor uma multiplicação grande em operações menores usando várias delas (2 para o Virtex-5 fazendo precisão única) usando os somadores do DSP ou a estrutura FPGA para somar os produtos parciais.

Você receberá uma resposta em alguns ciclos - 3 ou 4 para SP, talvez 5 para DP - dependendo de como você compõe a árvore do somador (e às vezes, onde as ferramentas de sintetizador insistem em adicionar registros de pipeline!).

No entanto, essa é a latência - como é canalizada, a taxa de transferência será de 1 resultado por ciclo de clock.

Para divisão, aproximei um operador recíproco usando uma tabela de pesquisa seguida de interpolação quadrática. Isso era mais preciso do que a precisão única e seria estendido (com mais hardware) ao DP, se eu quisesse. No Spartan-6, são necessários 2 BlockRams e 4 DSP / multiplicadores e algumas centenas de pares LUT / FF.

Sua latência é de 8 ciclos, mas, novamente, a taxa de transferência é de ciclo único; portanto, combinando-o com o multiplicador acima, você obtém uma divisão por ciclo de clock. Deve exceder 100MHz no Spartan-3. No Spartan-6, a estimativa de síntese é de 185MHz, mas com 1,6ns em um único caminho de roteamento, portanto, 200MHz está dentro do razoável.

No Virtex-5, alcançou 200 MHz sem esforço, assim como sua raiz quadrada gêmea. Eu tive alguns estudantes de verão tentando reencaminhá-lo - com menos de 12 ciclos de latência eles chegaram perto de 400 MHz - 2,5 ns para uma raiz quadrada.

Mas lembre-se de que você tem talvez de cem a mil unidades DSP? Isso oferece a você uma ou duas ordens de magnitude mais poder de processamento do que uma única unidade FP.

Brian Drummond
fonte
Obrigado pela sua resposta, Brian, mas não é toda a sua resposta sobre número inteiro multiplicar / dividir? Estou interessado principalmente em ponto flutuante.
theflash
2
Não, como eu disse, precisão única, significando ponto flutuante de 32 bits. Os mesmos princípios se aplicam a duplas, mas o uso de recursos é obviamente maior.
Brian Drummond
5

Ao usar um FPGA comum, como o Xilinx Spartan 3 ou o Virtex 5, quantos ciclos são necessários para executar uma multiplicação ou divisão de 64 bits de ponto flutuante de precisão dupla?

A resposta é sim!

Mas, falando sério, é super difícil criar um número. Ao projetar qualquer lógica complexa, sempre há uma troca entre coisas diferentes, e nenhuma abordagem é boa para todos os projetos. Vou tentar cobrir os grandes.

Com o design lógico, uma troca é tamanho versus velocidade. O exemplo fácil disso é, digamos, que um único multiplicador de ponto flutuante seja muito lento. Para acelerar tudo o que você precisa fazer é adicionar um segundo multiplicador. Seu tamanho lógico dobra, mas faz o número de multiplicações por segundo. Mas mesmo olhando apenas para um multiplicador, existem maneiras diferentes de multiplicar números; alguns são rápidos e grandes, outros são pequenos e lentos.

Outra desvantagem é a velocidade do relógio vs. os relógios por multiplicação. Eu poderia projetar alguma lógica que fizesse um único ponto flutuante se multiplicar em um relógio. Mas isso também exigiria que o relógio fosse mais lento - talvez tão lento quanto 10 MHz. Ou, eu poderia projetá-lo para funcionar com um relógio de 100 MHz, mas exigiria 10 relógios por multiplicação. A velocidade geral é a mesma (uma multiplicada em 100 ns), mas a outra possui um relógio mais rápido.

Relacionado ao parágrafo anterior, está o trade-off da velocidade do relógio versus a latência multiplicada. Existe uma técnica no projeto lógico chamada pipelining. Basicamente, você pega um pedaço da lógica e divide-o em estágios menores, onde cada estágio leva um ciclo de relógio para ser concluído. A vantagem aqui é que cada estágio pode estar trabalhando em uma multiplicação enquanto os outros estágios estão trabalhando em outras multiplicações. Por exemplo, digamos que estamos rodando a 100 MHz com um pipeline de 10 estágios. Isso significa que serão necessários 10 relógios para cada multiplicação, mas a lógica também está trabalhando em 10 multiplicações diferentes ao mesmo tempo! O legal é que ele está completando uma multiplicação a cada ciclo do relógio. Portanto, os relógios efetivos por multiplicação são 1, são necessários apenas 10 relógios para que cada uma dessas multiplicações seja concluída.

Portanto, a resposta à sua pergunta, qual a velocidade com que um FPGA pode fazer uma multiplicação depende de você. Os FPGAs vêm em diferentes tamanhos e velocidades, e você pode dedicar o máximo dessa lógica à tarefa que deseja. Mas vamos olhar para um cenário específico ...

Digamos que queremos usar o maior Spartan-3A e nos preocupamos apenas com o ponto flutuante de 32 bits. Uma multiplicação de flutuador de 32 bits requer um multiplicador inteiro de 24x24 e um somador de 8 bits. Isso requer quatro dos blocos multiplicadores dedicados e algumas fatias genéricas (muito poucas para se preocupar). O XC3S1400A possui 32 multiplicadores dedicados, para que possamos executar oito de nossos multiplicadores de ponto flutuante em paralelo. Um palpite muito aproximado da velocidade do relógio seria de cerca de 100 MHz. Podemos projetar totalmente esse projeto para que possamos completar quatro multiplicações de ponto flutuante de 32 bits por ciclo de clock, para uma velocidade efetiva de 800 milhões de multiplicações de ponto flutuante por segundo.

Uma multiplicação de dupla precisão requer 9 blocos multiplicadores dedicados por ponto flutuante, portanto, podemos fazer apenas 3 multiplicações em paralelo - resultando em uma velocidade de cerca de 300 milhões de multiplicações de ponto flutuante de 64 bits por segundo.

Para comparação, vamos considerar a nova série Xilinx Virtex-7. Como os multiplicadores dedicados são maiores, precisamos apenas de 6 blocos multiplicadores dedicados para uma multiplicação de ponto flutuante de 64 bits. Também existem 1.920 multiplicadores dedicados na maior parte - para que possamos fazer 320 multiplicações de ponto flutuante de precisão dupla em paralelo. Essas partes também são muito mais rápidas. Eu estimo que podemos rodar essas peças a 200 MHz, fornecendo uma velocidade total de 64 BILHÕES de pontos flutuantes de precisão dupla, multiplicados por segundo. Obviamente, esses chips custam cerca de US $ 10.000 cada.

A divisão de ponto flutuante é muito mais difícil de fazer rapidamente. A lógica é muito maior, especialmente em um FPGA, e é muito mais lenta. O mesmo vale para a maioria das CPUs, pois as instruções de divisão (ponto flutuante e ponto fixo) são muito mais lentas. Se a velocidade é importante, você deseja eliminar o maior número possível de divisões. Por exemplo, em vez de dividir por 5, você deve multiplicar por 0,2. De fato, em muitos sistemas, é mais rápido calcular um valor recíproco e multiplicar do que apenas dividir.

As mesmas compensações se aplicam à divisão como multiplicação - é apenas que a divisão sempre será muito mais lenta e muito maior que a multiplicação.


fonte
Um DSP da TI ou mesmo uma GPU em um Rasberry Pi 3 sugam a fumaça mágica do que antes era uma ALU no FPGA.
dhchdhd
3

Pelo menos no componente de divisão Altera ALT_FP, a divisão de precisão dupla de 64 bits (mantissa de 52 bits) leva 10, 24 ou 61 ciclos de relógio (selecionável). A precisão estendida única pode variar. Por exemplo, divisão de 43 bits em que o expoente é de 11 bits, a mantissa é de 26 bits e permite selecionar essas opções de latência de saída do relógio: 8, 18 ou 35. Inicie o ISE e verifique o que você pode ter no Xilinx.

Sócrates
fonte
1
Esses números são latência ou taxa de transferência?
Brian Drummond
Ciclos de relógio de precisão dupla são selecionáveis? Por qual fator? Para usar mais / menos blocos? E a multiplicação?
theflash
1
Não segui os parâmetros do componente, apenas iniciei uma janela principal e copiei o que diz. Provavelmente precisa ler o documento e verificar quais outros parâmetros a GUI do componente oferece. Então, basicamente, não posso responder às duas perguntas até agora.
Sócrates
2

Não há razão para que não possa demorar um único ciclo. Provavelmente seria um ciclo bastante grande e usaria muitos recursos ...

Martin Thompson
fonte
1

Tenho implementações de dupla precisão, ponto flutuante multiplicar e dividir. A multiplicação leva 13 ciclos de relógio e a divisão leva 109 ciclos de relógio. Ambos são canalizados para 100% de taxa de transferência (um resultado por relógio) e operação de cerca de 200 MHz em um Xilinx V5. Não sei quantos relógios você poderia obter a 100MHz, mas dividir por dois seria uma aposta segura.

Também tenho implementações de ponto flutuante de precisão única que usam 10 e 51 relógios na mesma situação.

Jim
fonte