Lors de l'utilisation d'un FPGA ordinaire tel que Xilinx Spartan 3 ou Virtex 5, combien de cycles une multiplication ou une division à double virgule flottante 64 bits prend-elle pour s'exécuter?
La réponse est oui!
Mais sérieusement, il est super difficile de trouver un chiffre. Lors de la conception d'une logique complexe, il y a toujours un compromis entre différentes choses, et aucune approche n'est bonne pour toutes les conceptions. Je vais essayer de couvrir les gros.
Avec la conception logique, un compromis est la taille contre la vitesse. L'exemple simple de ceci est supposons qu'un seul multiplicateur à virgule flottante soit trop lent. Pour l'accélérer, il vous suffit d'ajouter un deuxième multiplicateur. Votre taille logique double, mais le nombre de multiplications par seconde le fait. Mais même en regardant un seul multiplicateur, il existe différentes façons de multiplier les nombres; certains sont rapides et grands, d'autres sont petits et lents.
Un autre compromis est la vitesse d'horloge par rapport aux horloges par multiplication. Je pourrais concevoir une logique qui ferait une multiplication à virgule flottante unique dans une horloge. Mais cela nécessiterait également que l'horloge soit plus lente - peut-être aussi lente que 10 MHz. Ou, je pourrais le concevoir pour fonctionner avec une horloge de 100 MHz, mais il faudrait 10 horloges par multiplication. La vitesse globale est la même (on multiplie en 100 ns), mais on a une horloge plus rapide.
Le paragraphe précédent est lié au compromis entre la vitesse d'horloge et la latence multipliée. Il existe une technique de conception logique appelée pipelining. Fondamentalement, vous prenez un morceau de logique et le divisez en étapes plus petites, où chaque étape prend un cycle d'horloge pour terminer. L'avantage ici est que chaque étape peut travailler sur une multiplication tandis que les autres étapes travaillent sur d'autres multiplications. Par exemple, disons que nous fonctionnons à 100 MHz avec un pipeline à 10 étages. Cela signifie qu'il faudra 10 horloges pour chaque multiplication, mais la logique travaille également sur 10 multiplications différentes en même temps! Ce qui est cool, c'est qu'il effectue une multiplication à chaque cycle d'horloge. Ainsi, les horloges effectives par multiplication sont de 1, il suffit de 10 horloges pour chacune de ces multiplications.
Donc, la réponse à votre question, à quelle vitesse un FPGA peut-il faire une multiplication, dépend vraiment de vous. Les FPGA sont disponibles en différentes tailles et vitesses, et vous pouvez dédier autant de cette logique à la tâche à accomplir que vous le souhaitez. Mais regardons un scénario spécifique ...
Disons que nous voulons utiliser le plus grand Spartan-3A et que nous nous soucions uniquement des multiplications à virgule flottante 32 bits. Une multiplication flottante 32 bits nécessite un multiplicateur entier 24x24 et un additionneur 8 bits. Cela nécessite quatre des blocs multiplicateurs dédiés et quelques tranches génériques (trop peu pour s'en soucier). Le XC3S1400A possède 32 multiplicateurs dédiés, nous pouvons donc faire huit de nos multiplicateurs à virgule flottante en parallèle. Une estimation très approximative de la vitesse d'horloge serait d'environ 100 MHz. Nous pouvons entièrement canaliser cette conception afin de pouvoir effectuer quatre multiplications à virgule flottante 32 bits par cycle d'horloge, pour une vitesse effective de 800 millions de multiplications à virgule flottante par seconde.
Une multiplication double précision nécessite 9 blocs multiplicateurs dédiés par multiplication à virgule flottante, nous ne pouvions donc faire que 3 multiplications en parallèle, ce qui donne une vitesse d'environ 300 millions de multiplications à virgule flottante 64 bits par seconde.
À titre de comparaison, considérons la nouvelle série Xilinx Virtex-7. Les multiplicateurs dédiés étant plus gros, nous n'avons donc besoin que de 6 blocs multiplicateurs dédiés pour une multiplication à virgule flottante 64 bits. Il y a aussi 1 920 multiplicateurs dédiés sur la plus grande partie - nous pouvons donc faire 320 multiplications à virgule flottante double précision en parallèle. Ces pièces sont également beaucoup plus rapides. J'estime que nous pouvons exécuter ces parties à 200 MHz, ce qui nous donne une vitesse totale de 64 milliards de multiplications à virgule flottante double précision par seconde. Bien sûr, ces puces coûtent chacune environ 10 000 $ US.
La division en virgule flottante est beaucoup plus difficile à faire rapidement. La logique est beaucoup plus grande, en particulier dans un FPGA, et elle fonctionne beaucoup plus lentement. Il en va de même pour la plupart des CPU, dans la mesure où les instructions de division (virgule flottante et virgule fixe) s'exécutent beaucoup plus lentement. Si la vitesse est importante, vous voulez éliminer autant de divisions que possible. Par exemple, au lieu de diviser par 5, vous devez multiplier par 0,2. En fait, sur de nombreux systèmes, il est plus rapide de calculer une réciproque et de faire une multiplication que de simplement faire une division.
Les mêmes compromis s'appliquent à la division comme à la multiplication - c'est juste que la division sera toujours beaucoup plus lente et beaucoup plus importante que la multiplication.