Toutes les autres réponses populaires présentées ici parlent de différences littérales entre les FPGA et les CPU. Ils soulignent la nature parallèle du FPGA par rapport à la nature séquentielle d'un processeur, ou donnent des exemples de la raison pour laquelle certains algorithmes pourraient bien fonctionner sur un FPGA. Tous ces éléments sont bons et vrais, mais je suggérerais toutefois qu'il existe une différence plus fondamentale entre les processeurs et les FPGA.
Quel est le dénominateur commun entre un FPGA et un processeur? C'est qu'ils sont tous deux construits sur le silicium. Et dans certains cas, littéralement, les mêmes processus de silicium.
La différence fondamentale réside dans les abstractions que nous accumulons sur ce silicium. Il n’est pas possible pour un humain de comprendre tous les détails d’une conception de CPU moderne, du silicium au CI emballé. Ainsi, dans le cadre du processus d'ingénierie, nous divisons ce problème complexe en problèmes plus simples, gérables, que les humains peuvent comprendre.
Considérez ce qui est nécessaire pour transformer ce silicium en un processeur fonctionnel. Voici une vue quelque peu simplifiée des couches d'abstraction nécessaires à cet objectif:
Nous avons d’abord des ingénieurs qui savent créer des transistors en silicium. Ils savent comment concevoir de minuscules transistors capables de siffler et de commuter au rythme de 10 voire de 100 gigahertz, et de concevoir des transistors costauds capables de générer des signaux avec une puissance suffisante pour les envoyer via un circuit intégré et sur un circuit imprimé. à une autre puce.
Nous avons ensuite des concepteurs en logique numérique qui savent comment assembler ces transistors dans des bibliothèques comportant des centaines de cellules logiques différentes. Portes logiques, bascules électroniques, multiplexeurs et additionneurs, pour en nommer quelques-uns. Tous dans une variété de configurations.
Nous avons ensuite divers groupes d'ingénieurs qui savent comment assembler ces blocs numériques (et parfois analogiques) pour former des blocs fonctionnels de niveau supérieur, tels que des émetteurs-récepteurs à grande vitesse, des contrôleurs de mémoire, des prédicteurs de branche, des ALU, etc.
Ensuite, nous invitons les concepteurs de CPU à concevoir des processeurs haut de gamme en rassemblant ces unités fonctionnelles dans un système complet.
Et ça ne s'arrête pas là. À ce stade, nous avons un processeur opérationnel qui exécute le code assembleur, mais ce n'est pas un langage que la plupart des programmeurs écrivent actuellement.
- Nous pourrions avoir un compilateur C pour compiler en code assembleur (probablement via une représentation intermédiaire)
- Nous pourrions ajouter une autre abstraction au-dessus de C pour obtenir un langage orienté objet
- Nous pourrions même écrire une machine virtuelle au-dessus de C ou C ++ pour pouvoir interpréter des choses comme du code octet Java
Et les couches d'abstraction peuvent continuer à partir de là. Le point important ici est que ces couches d’abstraction se combinent pour donner un système basé sur un processeur qui évolue énormément et ne coûte qu’une fraction infime d’une conception en silicium personnalisée.
CEPENDANT, il est important de souligner que chaque abstraction a aussi un coût. Le concepteur de transistors ne construit pas le transistor parfait pour chaque cas d'utilisation. Il construit une bibliothèque raisonnable et utilise donc parfois un transistor qui consomme un peu plus de puissance ou un peu plus de silicium que ce qui est vraiment nécessaire pour le travail à accomplir. Et de même, les concepteurs logiques ne construisent pas toutes les cellules logiques possibles. Ils peuvent créer une porte NAND à 4 entrées et une porte NAND à 8 entrées, mais que se passe-t-il lorsqu'un autre ingénieur a besoin d'un NAND à 6 entrées? Il utilise une porte NAND à 8 entrées et lie 2 entrées inutilisées, ce qui entraîne une perte de ressources en silicium et une puissance réduite. Et ainsi cela monte dans la chaîne des abstractions. Chaque couche nous donne un moyen de gérer la complexité,
Maintenant, comparez ces abstractions à ce qui est nécessaire pour un FPGA. Essentiellement, les abstractions FPGA s'arrêtent au deuxième rang de la liste ci-dessus. Le FPGA permet aux développeurs de travailler au niveau de la couche logique numérique. Il est un peu plus sophistiqué que cela car les processeurs sont "codés en dur" sur cette couche et les FPGA doivent être configurés à l'exécution (ce qui explique pourquoi les processeurs utilisent généralement des fréquences beaucoup plus élevées), mais la vérité essentielle est peu d’abstractions pour les FPGA que pour les CPU.
Alors, pourquoi un FPGA peut-il être plus rapide qu'un processeur? Essentiellement, c'est parce que le FPGA utilise beaucoup moins d'abstractions qu'un processeur, ce qui signifie que le concepteur travaille plus près du silicium. Il ne paie pas les coûts de toutes les couches d'abstraction requises pour les processeurs. Il code à un niveau inférieur et doit travailler plus fort pour obtenir un certain nombre de fonctionnalités, mais la récompense est qu'il obtient de meilleures performances.
Mais bien sûr, il y a un inconvénient pour moins d'abstractions. Toutes ces abstractions de la CPU sont là pour une bonne raison. Ils nous donnent un paradigme de codage beaucoup plus simple, ce qui signifie que plus de personnes peuvent facilement se développer pour elles. Cela signifie qu'il existe de nombreuses autres conceptions de processeurs et que nous en tirons des avantages énormes en termes de prix, d'échelle et de mise sur le marché.
Donc là vous l'avez. Les FPGA ont moins d'abstractions et peuvent donc être plus rapides et plus efficaces, mais difficiles à programmer. Les processeurs ont de nombreuses conceptions d'abstractions pour les rendre faciles à développer, évolutives et bon marché. Mais ils abandonnent la vitesse et la puissance dans le commerce pour ces avantages.