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.