Todas as outras respostas populares apresentadas aqui falam sobre diferenças literais entre FPGAs e CPUs. Eles apontam a natureza paralela do FPGA versus a natureza seqüencial de uma CPU ou dão exemplos de por que certos algoritmos podem funcionar bem em um FPGA. Tudo isso é bom e verdadeiro, mas eu sugeriria, no entanto, que há uma diferença mais fundamental entre CPUs e FPGAs.
Qual é o denominador comum entre um FPGA e uma CPU? É que ambos são construídos sobre silicone. E, em alguns casos, literalmente, os mesmos processos de silício.
A diferença fundamental são as abstrações que empilhamos sobre esse silício. Não é possível para um ser humano entender os detalhes completos de um único design moderno de CPU, do silício ao IC empacotado. Assim, como parte do processo de engenharia, dividimos esse problema complexo em problemas menores e fáceis de administrar, com os quais os humanos podem entender.
Considere o que é necessário para transformar esse silício em uma CPU em funcionamento. Aqui está uma visão um pouco simplificada das camadas de abstração necessárias para esse objetivo:
Primeiro, temos engenheiros que sabem como criar transistores a partir de silício. Eles sabem como projetar transistores minúsculos que consomem energia e comutam na taxa de 10 ou mesmo 100 gigahertz, e sabem como projetar transistores robustos que podem gerar sinais com energia suficiente para enviá-los de um pacote de IC e através de uma PCB para outro chip.
Depois, temos designers de lógica digital que sabem como reunir esses transistores em bibliotecas com centenas de células lógicas diferentes. Portões lógicos, chinelos, muxes e somadores, para citar alguns. Tudo em uma variedade de configurações.
A seguir, temos vários grupos de engenheiros que sabem como montar esses blocos digitais (e às vezes analógicos) para formar blocos funcionais de nível superior, como transceptores de alta velocidade, controladores de memória, preditores de ramificação, ALUs, etc.
Então, temos designers de CPU para arquitetar projetos de CPU de ponta, reunindo essas unidades funcionais em um sistema completo.
E não para por aí. Neste ponto, temos uma CPU funcional que executa o código de montagem, mas essa não é uma linguagem que a maioria dos programadores escreve atualmente.
- Podemos ter um compilador C para compilar no código de montagem (provavelmente através de alguma representação intermediária)
- Poderíamos adicionar outra abstração em cima de C para obter uma linguagem orientada a objetos
- Podemos até escrever uma máquina virtual sobre C ou C ++ para interpretar coisas como código de bytes Java
E as camadas de abstração podem continuar a partir daí. O ponto importante aqui é que essas camadas de abstração se combinam para produzir um sistema baseado em CPU que escala enormemente e custa uma pequena fração de um design de silicone personalizado.
No entanto, o ponto importante a ser destacado aqui é que cada abstração também acarreta um custo. O designer do transistor não cria o transistor perfeito para todos os casos de uso. Ele constrói uma biblioteca razoável e, portanto, às vezes é usado um transistor que consome um pouco mais de energia ou um pouco mais de silício do que o necessário para o trabalho em questão. Da mesma forma, os designers de lógica não constroem todas as células lógicas possíveis. Eles podem construir um portão NAND de 4 entradas e um portão NAND de 8 entradas, mas o que acontece quando outro engenheiro precisa de um NAND de 6 entradas? Ele usa uma porta NAND de 8 entradas e amarra 2 entradas não utilizadas, o que resulta em perda de recursos de silício e energia da cintura. E assim sobe a cadeia de abstrações. Cada camada nos fornece uma maneira de lidar com a complexidade,
Agora compare essas abstrações com o que é necessário para um FPGA. Essencialmente, as abstrações do FPGA param em # 2 na lista acima. O FPGA permite que os desenvolvedores trabalhem na camada de lógica digital. É um pouco mais sofisticado do que isso, porque as CPUs são 'codificadas' nesta camada e os FPGAs devem ser configurados no tempo de execução (que, BTW, é o motivo pelo qual as CPUs normalmente executam frequências muito mais altas), mas a verdade importante é que isso está longe poucas abstrações para FPGAs do que para CPUs.
Então, por que um FPGA pode ser mais rápido que uma CPU? Em essência, é porque o FPGA usa muito menos abstrações que uma CPU, o que significa que o designer trabalha mais próximo do silício. Ele não paga os custos de todas as muitas camadas de abstração necessárias para as CPUs. Ele codifica em um nível mais baixo e precisa trabalhar mais para obter um determinado nível de funcionalidade, mas a recompensa é que ele obtém um desempenho superior.
Mas é claro que também há um lado negativo em menos abstrações. Todas essas abstrações de CPU estão lá por um bom motivo. Eles nos dão um paradigma de codificação muito mais simples, o que significa que mais pessoas podem se desenvolver facilmente para elas. Isso, por sua vez, significa que existem muitos outros designs de CPU e, portanto, temos enormes benefícios de preço / escala / tempo de colocação no mercado das CPUs.
Então aí está. Os FPGAs têm menos abstrações e, portanto, podem ser mais rápidos e mais eficientes em termos de energia, mas difíceis de programar. As CPUs têm muitas abstrações projetadas para torná-las fáceis de desenvolver, escaláveis e baratas. Mas eles perdem velocidade e poder no comércio por esses benefícios.