Il s'agit d'une collection de micro-benchmarks GPU. Chaque test est conçu pour tester un scénario ou un mécanisme matériel particulier. Certains des critères de référence ont été utilisés pour produire des données pour ces articles :
"Estimation des performances analytiques lors de la génération de code sur les GPU modernes"
"Ingénierie des performances pour les noyaux de multiplication de matrices hautes et fines réels et complexes sur GPU"
Les benchmarks appelés gpu-<benchmarkname>
sont hipifiables ! Alors que la cible Makefile par défaut construit l'exécutable CUDA cuda-<benchmarkname>
, la cible make hip-<benchmarkname>
utilise l'outil hipify-perl pour créer un fichier main.hip
à partir du fichier main.cu
et le construit à l'aide du compilateur hip. . Les fichiers principaux de CUDA sont écrits pour que l'outil hipify fonctionne sans autre intervention.
Jetez également un œil aux fonctions gpu-metrics, qui fournissent un moyen concis de mesurer les mesures des compteurs de performances matérielles d'un lancement de noyau dans le programme en cours d'exécution.
Si tout cela est utile, les étoiles et les citations sont les bienvenues !
Mesure la bande passante des noyaux de streaming pour différentes occupations. Une allocation de mémoire partagée sert de spoiler, de sorte que seuls deux blocs de thread peuvent s'exécuter par SM. L'analyse de la taille du bloc de thread de 32 à 1 024 analyse l'occupation de 3 % à 100 %.
Noyau | Formule | |
---|---|---|
initialisation | UNE[je] = c | 1 flux de magasin |
lire | somme = A[i] | 1 flux de chargement |
échelle | A[je] = B[je] * c | 1 flux de chargement, 1 flux de stockage |
triade | A[i] = B[i] + c * C[i] | 2 flux de chargement, 1 flux de magasin |
3 points | A[i] = B[i-1] + B[i] + B[i+1] | 1 flux de chargement, 1 flux de stockage |
5 points | A[i] = B[i-2] + B[i-1] + B[i] + B[i+1] + B[i+2] | 1 flux de chargement, 1 flux de stockage |
Résultats d'un NVIDIA-H100-PCIe / CUDA 11.7
threads blockSize %occ | init lecture échelle triade 3pt 5pt 32 3648 3 % | Go/s : 228 96 183 254 168 164 64 7296 6,2 % | Go/s : 452 189 341 459 316 310 96 10944 9,4 % | Go/s : 676 277 472 635 443 436 128 14592 12,5 % | Go/s : 888 368 607 821 567 558 160 18240 15,6 % | Go/s : 1093 449 704 966 680 670 192 21888 18,8 % | Go/s : 1301 533 817 1121 794 781 224 25536 21,9 % | Go/s : 1495 612 925 1264 903 889 256 29184 25,0 % | Go/s : 1686 702 1037 1399 1005 989 288 32832 28,1 % | Go/s : 1832 764 1124 1487 1100 1082 320 36480 31,2 % | Go/s : 2015 841 1213 1564 1188 1169 352 40128 34,4 % | Go/s : 2016 908 1295 1615 1269 1250 384 43776 37,5 % | Go/s : 2016 985 1378 1644 1348 1326 416 47424 40,6 % | Go/s : 2016 1045 1439 1641 1415 1395 448 51072 43,8 % | Go/s : 2016 1 116 1 497 1 649 1 472 1 453 480 54 720 46,9 % | Go/s : 2016 1 179 1 544 1 655 1 521 1 505 512 58 368 50,0 % | Go/s : 2017 1261 1583 1675 1556 1545 544 62016 53,1 % | Go/s : 2016 1 300 1 591 1 669 1 572 1 563 576 65 664 56,2 % | Go/s : 2016 1 362 1 607 1 678 1 587 1 579 608 69 312 59,4 % | Go/s : 2018 1416 1619 1689 1598 1592 640 72960 62,5 % | Go/s : 2016 1473 1639 1712 1613 1607 672 76608 65,6 % | Go/s : 2016 1 527 1 638 1 714 1 618 1 613 704 80 256 68,8 % | Go/s : 2015 1 578 1 644 1 725 1 625 1 619 736 83 904 71,9 % | Go/s : 2016 1624 1651 1738 1632 1628 768 87552 75,0 % | Go/s : 2016 1 680 1 666 1 755 1 642 1 638 800 91 200 78,1 % | Go/s : 2015 1 714 1 663 1 758 1 645 1 642 832 94 848 81,2 % | Go/s : 2016 1 759 1 668 1 770 1 649 1 647 864 98 496 84,4 % | Go/s : 2016 1 795 1 673 1 779 1 654 1 651 896 102 144 87,5 % | Go/s : 2016 1 837 1 686 1 796 1 663 1 662 928 105 792 90,6 % | Go/s : 2018 1 871 1 684 1 800 1 666 1 664 960 109 440 93,8 % | Go/s : 2016 1 897 1 688 1 808 1 672 1 670 992 113 088 96,9 % | Go/s : 2016 1919 1693 1818 1678 1675 1024 116736 100,0 % | Go/s : 2016 1942 1704 1832 1686 1683
Les résultats pour le noyau SCALE et une sélection de GPU :
Notez que les résultats H100 concernent la version PCIe, qui a une bande passante DRAM inférieure à celle de la version SXM !
Pointeur poursuivant une référence pour la mesure de la latence. Une seule chaîne traverse entièrement un tampon dans un ordre aléatoire. Un schéma de partitionnement est utilisé pour garantir que toutes les lignes de cache sont atteintes exactement une fois avant d'y accéder à nouveau. La latence en cycles d'horloge est calculée avec la fréquence d'horloge actuelle.
Transitions de cache Sharp L1 à 128/192/256 Ko pour NVIDIAS V100/A100/H100 et à 16 Ko pour le MI210 d'AMD. Le V100 et le MI210 disposent tous deux d'un cache L2 de 6 Mo. Les A100 et H100 disposent d'un cache L2 segmenté de 2 x 20 Mo et 2 x 25 Mo, qui se manifeste par un petit plateau intermédiaire lorsque les données sont récupérées depuis la section L2 éloignée.
Le GPU RDNA2, le RX6900XT, possède la hiérarchie de cache la plus intéressante avec ses 4 niveaux de cache bien visibles : le cache L0 de 16 Ko, le cache L1 semi-partagé de 128 Ko, le cache L2 de 4 Mo et le cache Infinity de 128 Mo. Il s'agit également du GPU avec la fréquence la plus élevée, de sorte que les temps d'accès absolus seraient inférieurs à ceux des autres GPU. Mesurer la latence de la DRAM est difficile, car l'interface DRAM ne fonctionne pas sur un seul front d'onde, ce qui entraîne des latences DRAM > 2 000 cycles.
Mesure les bandes passantes du premier et du deuxième niveau de cache. Lance un bloc de thread par SM. Chaque bloc de thread lit à plusieurs reprises le contenu du même tampon. Des tailles de tampon variables modifient le niveau de cache ciblé.
Les capacités de cache L1 de 16 Ko (MI100/MI210), 128 Ko (V100), 192 Ko (A100) et 256 Ko (H100) sont très prononcées et pointues. Les trois architectures NVIDIA transfèrent toutes deux près de 128B/cycle/SM, la valeur maximale mesurée sur les MI100 et MI210 d'AMD dépend du type de données. Pour une double précision, le maximum est de 32B/cycle/CU. Pour les types de données simple précision et 16 B (soit float4, soit double2), la bande passante peut atteindre 64 B.
Ce test ne cible pas les niveaux de hiérarchie de mémoire au-delà du deuxième niveau de cache (c'est-à-dire la DRAM pour la plupart des GPU), car les ensembles de données ne sont pas clairement supprimés d'un cache partagé. Étant donné que tous les blocs de thread lisent les mêmes données, il existe un grand potentiel de réutilisation dans le cache partagé avant que les données ne soient expulsées. Les valeurs du RX6900XT sont dingues au-delà de son cache L1 partagé de 128 Ko. Les A100 et H100 chutent légèrement à 20/25 Mo, lorsque la capacité d'une seule section de cache est dépassée. Au-delà de ce point, les données ne peuvent pas être répliquées dans les deux sections de cache L2 et la bande passante maximale diminue, car les données doivent également être récupérées depuis l'autre section.
Mesure les bandes passantes des niveaux de cache partagé. Ce benchmark ne cible explicitement pas les caches L1.
Les trois GPU ont des bandes passantes de cache L2 similaires d'environ 5,x To/s, mais avec des capacités différentes.
Une observation remarquable est le RX6900XT, qui dispose d'un deuxième niveau de cache partagé, le 128 Mo Infinity Cache. À près de 1,92 To/s, elle est aussi rapide que la DRAM de l'A100. Au tout début, on peut voir le cache L1 semi-partagé du RX6900XT, où pour certains placements de blocs, les 4 caches L1 ont un petit effet. Il en va de même pour le H100, qui dispose d'un cache L1 plus grand avec une chance accrue pour un bloc de thread de trouver les données sur lesquelles il souhaite travailler déjà dans le cache L1 chargé par le bloc de thread précédent. Cela ne fonctionne que pour les petits ensembles de données, où il n'y a que quelques blocs de données différents et cette chance est encore importante. Ceci n'est pas attribuable au réseau de mémoire partagée distribuée, qui permet de charger à partir de la mémoire partagée d'autres SM, car il ne fonctionne que pour les charges de mémoire partagée explicites et non pour les charges globales. Cela nécessiterait que les balises vérifient chaque cache L1 du GPC pour toute charge.
Lecture seule, test de cache L1 qui accède à la mémoire avec des pas de 1 à 128. La bande passante est convertie en octets par cycle et SM. Les foulées de 1 à 128 sont formatées dans un tableau 16x8, car cela met en évidence les modèles récurrents de multiples de 2/4/8/16.
Chaque appareil reçoit un ajustement de
qui modélise les performances avec une surcharge de démarrage
Ce programme analyse une gamme d'intensités de calcul, en faisant varier le nombre de déclenchements de la boucle interne. Il convient à la fois pour étudier la transition de la mémoire au calcul des codes liés ainsi que pour la consommation d'énergie, les fréquences d'horloge et les températures lors de l'utilisation de plusieurs GPU. Le script shell series.sh crée un exécutable pour chaque valeur et les exécute les uns après les autres une fois la construction terminée.
Le Code s'exécute simultanément sur tous les appareils disponibles. Exemple de sortie sur quatre Tesla V100 PCIe 16 Go :
1 640 blocs 0 ses 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 138 W 60°C2 640 blocs 0 ses 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 137 W 59°C3 640 blocs 0 c'est 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 56°C0 640 blocs 0 ses 0,125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 54°C1 640 blocs 8 ses 1,125 Fl/B 861 Go/s 968 Go/s 1380 Mhz 159 W 63°C0 640 blocs 8 ses 1,125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 142 W 56°C2 640 blocs 8 ses 1,125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 157 W 62°C3 640 blocs 8 ses 1,125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 144 W 59°C[...]0 640 blocs 64 ses 8,125 Fl/B 811 GB/s 6587 GF/s 1380 Mhz 223 W 63 °C3 640 blocs 64 ses 8,125 Fl/B 813 GB/s 6604 GF/s 1380 Mhz 230 W 66°C1 640 blocs 64 ses 8,125 Fl/B 812 GB/s 6595 GF/s 1380 Mhz 241 W 71°C2 640 blocs 64 ses 8,125 Fl/B 813 Go/s 6603 Gf/s 1380 MHz 243 W 69°C
Mesure le taux de transfert hôte-appareil de la fonction cudaMemcpy sur une plage de tailles de transfert
Exemple de sortie pour un Tesla V100 PCIe 16 Go
1 Ko 0,03 ms 0,03 Go/s 0,68 % 2 Ko 0,03 ms 0,06 Go/s 5,69 % 4 Ko 0,03 ms 0,12 Go/s 8,97 % 8 Ko 0,03 ms 0,24 Go/s 6,25 % 16 Ko 0,04 ms 0,44 Go/s 5,16 % 32 Ko 0,04 ms 0,93 Go/s 2,70 % 64 Ko 0,04 ms 1,77 Go/s 5,16 % 128 Ko 0,04 ms 3,46 Go/s 7,55 % 256 Ko 0,05 ms 5,27 Go/s 1,92 % 512 Ko 0,07 ms 7,53 Go/s 1,03 % 1 024 Ko 0,11 ms 9,25 Go/s 2,52 % 2 048 Ko 0,20 ms 10,50 Go/s 1,07 % 4 096 Ko 0,37 ms 11,41 Go/s 0,58 % 8 192 Ko 0,71 ms 11,86 Go/s 0,44 % 16 384 Ko 1,38 ms 12,11 Go/s 0,14 % 32 768 Ko 2,74 ms 12,23 Go/s 0,03 % 65 536 Ko 5,46 ms 12,29 Go/s 0,08 % 131 072 Ko 10,89 ms 12,32 Go/s 0,02 % 262 144 Ko 21,75 ms 12,34 Go/s 0,00 % 524 288 Ko 43,47 ms 12,35 Go/s 0,00 % 1048576 Ko 86,91 ms 12,35 Go/s 0,00 %
Mesure le taux de transfert de la mémoire unifiée CUDA à l'aide d'un noyau triade STREAM. Une gamme de tailles d'ensembles de données est utilisée, à la fois plus petite et plus grande que la mémoire de l'appareil. Exemple de sortie sur un Tesla V100 PCIe 16 Go :
taille du tampon bande passante temporelle 24 Mo 0,1 ms 3,2 % 426,2 Go/s 48 Mo 0,1 ms 24,2 % 511,6 Go/s 96 Mo 0,1 ms 0,8 % 688,0 Go/s 192 Mo 0,3 ms 1,8 % 700,0 Go/s 384 Mo 0,5 ms 0,5 % 764,6 Go/s 768 Mo 1,0 ms 0,2 % 801,8 Go/s 1 536 Mo 2,0 ms 0,0 % 816,9 Go/s 3 072 Mo 3,9 ms 0,1 % 822,9 Go/s 6 144 Mo 7,8 ms 0,2 % 823,8 Go/s 12 288 Mo 15,7 ms 0,1 % 822,1 Go/s 24 576 Mo 5 108,3 ms 0,5 % 5,0 Go/s 49 152 Mo 10 284,7 ms 0,8 % 5,0 Go/s
Mesure la latence et le débit des opérations FMA, DIV et SQRT. Il analyse les combinaisons de ILP=1..8, en générant 1..8 chaînes de dépendances indépendantes, et TLP, en faisant varier le nombre de distorsions sur un SM de 1 à 32. Le résultat final est une table ILP/TLP, avec l'inverse débits (cycles par opération) :
Exemple de sortie sur un Tesla V100 PCIe 16 Go :
DFMA 8,67 4,63 4,57 4,66 4,63 4,72 4,79 4,97 4,29 2,32 2,29 2,33 2,32 2,36 2,39 2,48 2,14 1,16 1,14 1,17 1,16 1,18 1,20 1,24 1,08 1,05 1,05 1,08 1,08 1,10 1,12 1,14 1,03 1,04 1,04 1,08 1,07 1,10 1,11 1,14 1,03 1,04 1,04 1,08 1,07 1,10 1,10 1,14DDIV111,55 111,53 111,53 111,53 111,53 668,46 779,75 891,05 55,76 55,77 55,76 55,76 55,76 334,26 389,86 445,51 27,88 27,88 27,88 27,88 27,88 167,12 194,96 222,82 14,11 14,11 14,11 14,11 14,11 84,77 98,89 113,00 8,48 8,48 8,48 8,48 8,48 50,89 59,36 67,84 7,51 7,51 7,51 7,51 7,51 44,98 52,48 59,97DSQRT101,26 101,26 101,26 101,26 101,26 612,76 714,79 816,83 50,63 50,62 50,63 50,63 50,62 306,36 357,38 408,40 25,31 25,31 25,31 25,31 25,31 153,18 178,68 204,19 13,56 13,56 13,56 13,56 13,56 82,75 96,83 110,29 9,80 9,80 9,80 9,80 9,80 60,47 70,54 80,62 9,61 9,61 9,61 9,61 9,61 58,91 68,72 78,53
Certaines fonctionnalités peuvent être extraites du tracé.
Latences :
DFMA : 8 cycles
DDIV : 112 cycles
DSQRT : 101 cycles
Débit d'une chaîne (fonctionne sur un quadrant SM), aucune dépendance :
DFMA : 1/4 par cycle (ILP 2, pour chevaucher les opérations)
DDIV : 1/112 par cycle (pas d'ILP/chevauchement)
DSQRT : 1/101 par cycle (pas d'ILP/chevauchement)
Débit de plusieurs chaînes (tous les quadrants SM), dépendances non pertinentes :
DFMA : 1 par cycle
DDIV : 1/7,5 cycles
DSQRT : 1/9,6 cycles