À quelle vitesse une multiplication ou une division 64 bits s'exécute-t-elle sur un FPGA?

8

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?

Pour autant que je comprends, le FPGA n'a pas de FPU dur et vous devez en créer un à l'aide des bibliothèques IEEE standard ou d'autres matériaux. Cela signifie qu'il ne s'exécutera pas en un seul cycle, je recherche donc une estimation approximative pour comparer les performances d'un processeur 100 MHz avec un FPGA Spartan / Virtex 100 MHz.

Je suis principalement intéressé par les opérateurs à virgule flottante, mais si vous avez de l'expérience avec les opérations entières, cela serait également apprécié.

Le flash
la source
3
Tout d'abord, il convient de clarifier la question: vous parlez de MPY / division 64 bits, ce qui impliquerait une multiplication / division d'entier 64 bits - puis vous mentionnez FPU, ce qui implique une virgule flottante double précision. Les détails de la réponse seront différents pour chaque ...
Brian Drummond
2
Pour une multiplication à la fois, le temps est probablement comparable ou légèrement en faveur du CPU. De toute évidence, l'avantage du FPGA est que vous pouvez en avoir beaucoup en parallèle.
pjc50

Réponses:

12

Je n'ai pas fait cela pour la double précision FP, mais les mêmes principes s'appliquent que pour la simple précision, pour laquelle j'ai implémenté la division (multipliée par réciproque).

Ce que ces FPGA ont, au lieu des FPU, ce sont des blocs DSP / multiplicateurs câblés, capables de mettre en œuvre une multiplication 18 * 18 ou (Virtex-5) 18 * 25 en un seul cycle. Et les plus gros appareils en comptent environ un millier, voire 126 ou 180 à l'extrémité supérieure des familles Spartan-3 ou Spartan-6.

Vous pouvez donc décomposer une grande multiplication en opérations plus petites en utilisant plusieurs d'entre elles (2 pour le Virtex-5 en simple précision) en utilisant les additionneurs du DSP ou le tissu FPGA pour additionner les produits partiels.

Vous obtiendrez une réponse en quelques cycles - 3 ou 4 pour SP, peut-être 5 pour DP - selon la façon dont vous composez l'arborescence des additionneurs (et parfois, où les outils de synthés insistent pour ajouter des registres de pipeline!).

Cependant, c'est la latence - car il est canalisé, le débit sera de 1 résultat par cycle d'horloge.

Pour la division, j'ai approximé un opérateur réciproque en utilisant une table de recherche suivie d'une interpolation quadratique. Cela était plus précis que la simple précision et s'étendrait (avec plus de matériel) à DP si je le voulais. Dans Spartan-6, il faut 2 BlockRams et 4 DSP / multiplicateurs, et quelques centaines de paires LUT / FF.

Sa latence est de 8 cycles, mais encore une fois le débit est à cycle unique, donc en le combinant avec le multiplicateur ci-dessus, vous obtenez une division par cycle d'horloge. Il devrait dépasser 100 MHz en Spartan-3. Dans Spartan-6, l'estimation de la synthèse est de 185 MHz, mais avec 1,6 ns sur un seul chemin de routage, 200 MHz sont donc raisonnables.

Dans Virtex-5, il a atteint 200 MHz sans effort, tout comme son jumeau à racine carrée. J'ai eu quelques étudiants d'été qui tentaient de le redistribuer - avec moins de 12 cycles de latence, ils ont atteint près de 400 MHz - 2,5 ns pour une racine carrée.

Mais rappelez-vous que vous avez peut-être de cent à mille unités DSP? Cela vous donne un ou deux ordres de grandeur plus de puissance de traitement qu'une seule unité FP.

Brian Drummond
la source
Merci pour votre réponse, Brian, mais n'est-ce pas toute votre réponse sur la multiplication / division des nombres entiers? Je m'intéresse principalement à la virgule flottante.
TheFlash
2
Non, comme je l'ai dit, en simple précision, c'est-à-dire en virgule flottante 32 bits. Les mêmes principes s'appliquent pour les doubles, mais l'utilisation des ressources est évidemment plus élevée.
Brian Drummond
5

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.


la source
Un TI DSP ou même un GPU sur un Rasberry Pi 3 aspirera la fumée magique de ce qui était autrefois un ALU sur FPGA.
dhchdhd
3

Au moins sur la composante de division Altera ALT_FP, la division 64 bits à double précision (mantisse 52 bits) prend 10, 24 ou 61 cycles d'horloge (sélectionnables). La précision étendue unique peut varier. Par exemple, la division 43 bits où l'exposant est de 11 bits, la mantisse est de 26 bits, il permet de sélectionner ces options de latence de sortie d'horloge: 8, 18 ou 35. Démarrez ISE et vérifiez ce que vous pouvez avoir sur Xilinx.

Socrate
la source
1
Ces chiffres sont-ils la latence ou le débit?
Brian Drummond
Les cycles d'horloge à double précision sont sélectionnables? Par quel facteur? Pour utiliser plus / moins de blocs? Et la multiplication?
TheFlash
1
Je ne me suis pas déplacé avec les paramètres du composant, j'ai juste ouvert une fenêtre principale et copié ce qu'il dit. Probablement besoin de lire le docu et de vérifier quels autres paramètres le composant gui offre. Donc, fondamentalement, je ne peux pas répondre aux deux questions maintenant.
Socrates
2

Il n'y a aucune raison que cela ne prenne pas un seul cycle. Ce serait probablement un cycle assez long cependant et utiliserait beaucoup de ressources ...

Martin Thompson
la source
1

J'ai des implémentations de multiplication et de division en virgule flottante double précision. La multiplication prend 13 cycles d'horloge et la division prend 109 cycles d'horloge. Les deux sont pipelinés pour un débit de 100% (un résultat par horloge) et un fonctionnement d'environ 200 MHz sur un Xilinx V5. Je ne sais pas combien d'horloges de moins vous pourriez obtenir à 100 MHz, mais la division par deux serait une valeur sûre.

J'ai également des implémentations à virgule flottante simple précision qui prennent 10 et 51 horloges dans la même situation.

Jim
la source