NVIDIA détaille la version PCIe du Tesla V100

Quelques mois après la première annonce de ses processeurs graphiques pour le calcul intensif Tesla V100, NVIDIA dévoile les derniers détails sur la version PCIe de ces cartes. L’annonce précédente portait uniquement sur les modules SXM2, un format propriétaire nécessaire notamment pour le bus NVLink. Les grandes lignes de Volta sont déjà connues : ces puces de 815 mm² sont fabriquées avec un procédé spécifique de TSCM, le 12FFN, une variante du 12 nm ; l’architecture des cœurs fait place à des unités spécifiques aux traitements tensoriels, les caches L1 sont unifiés au sein d’un multiprocesseur de flux.

La version PCIe de ces cartes, certes plus standard, est quelque peu limitée par rapport au format SXM2 : la puissance délivrable est moindre (250 W au lieu de 300 W), ce qui limite de facto la fréquence des processeurs graphiques (qui passe de 1455 à 1370 MHz, soit une perte d’approximativement six pour cent). La puissance de calcul est donc aussi en baisse : au plus vingt-huit téraflops en demi-précision (au lieu de trente), par exemple. Le processeur en lui-même est identique, avec le même nombre de cœurs CUDA par exemple (5376). Cependant, la diminution de puissance de calcul n’est pas directement proportionnelle à la diminution d’énergie consommée : l’efficacité énergétique augmente donc (de cent gigaflops par watt à cent douze).

Contrairement à la génération Pascal (P100), ces processeurs spécifiquement prévus pour le calcul intensif ne seront pas déclinés en une gamme : le P100 existait en versions seize et douze gigaoctets de mémoire, le V100 n’existera qu’en version seize gigaoctets. Cela est probablement dû au fait que NVIDIA maîtrise mieux les processus de fabrication de puces avec interposeur (requis pour une mémoire de type HBM2) — ce qui diminue le taux de puces partiellement mal formées — et que la production de mémoire HBM2 a augmenté en volume.

On attend les premières cartes PCIe pour la fin de l’année, notamment intégrées dans des systèmes de HP Entreprise.

Source : NVIDIA Formally Announces PCIe Tesla V100: Available Later This Year.

Les États-Unis n’ont plus de superordinateur dans le top 3 mondial

La situation est inédite depuis 1996 : les États-Unis ne classent plus le moindre superordinateur dans le top 3 mondial. En effet, la liste des superordinateurs les plus puissants de juin 2017 montre que la Suisse a, grâce à la mise à jour de son Piz Daint, détrôné Titan à la troisième place. Les deux premières restent occupées par la Chine, avec TaihuLight (nonante-trois pétaflops — nonante-trois millions de milliards d’opérations en virgule flottante par seconde —, premier depuis juin 2016) et Tianhe-2 (trente-quatre pétaflops, passé de la première place en juin 2013 à la deuxième avec l’arrivée de TaihuLight).

Le superordinateur hébergé à ETH Zürich a plus que doublé sa puissance pour maintenant atteindre 19,6 pétaflops, grâce à de nouveaux cabinets Cray XC50. Le financement de quarante millions de francs suisses (trente-sept millions d’euros) a servi au remplacement des machines avec des GPU NVIDIA plus anciens (des cartes Tesla K20X) avec la toute dernière génération Pascal (P100).

Le gain ne se mesure pas qu’en puissance de calcul, mais également en consommation énergétique : Piz Daint consomme quatre fois moins que Titan (2,3 MW contre 8,2 pour Titan), avec une différence de puissance de calcul d’à peine deux pétaflops (Titan fournit dix-sept pétaflops de puissance de calcul). Selon la manière d’utiliser le superordinateur, il peut monter jusqu’à 10,4 gigaflops par watt consommé — pas la plus haute efficacité énergétique, mais sûrement à cette échelle.

Ainsi, Piz Daint est composé de deux types de nœuds de calcul. 5320 nœuds XC50 sont équipés avec des processeurs Intel de génération Haswell (Xeon E5-2690 v3, deux par nœud) et un accélérateur NVIDIA Tesla P100 par nœud. 1430 nœuds XC40 ont été conservés et ne possèdent pas d’accélérateur — ils possèdent par contre deux processeurs d’une génération plus récente, Broadwell (Xeon E5-2695 v4).

Outre la partie calcul pure, les travaux sur Piz Daint ont servi à déployer une nouvelle technologie de Cray, DataWarp, pour quadrupler la bande passante envers la zone de stockage à long terme. En pratique, il devient donc plus facile pour les utilisateurs du système d’effectuer des simulations (matériaux, physique, géophysique, chimie, climat, météo, etc.) en parallèle plutôt que les unes après les autres.

Au contraire de la plupart des organismes utilisant des superordinateurs, le CSCS (en charge de Piz Daint) a très vite commencé à utiliser des GPU pour les calculs (dès 2010), de telle sorte que la majorité des calculs effectués le sont sur les accélérateurs disponibles (alors que, au début, peu de machines en étaient équipées).

Plus bas dans la liste, après le top 10 (peu altéré, si ce n’est les investissements du CSCS dans Piz Daint), on constate une augmentation de la puissance moyenne des machines — mais aussi de leur efficacité énergétique. Ils utilisent de plus en plus d’accélérateurs pour y arriver : généralement, soit des NVIDIA Tesla, soit des Intel Xeon Phi, très rarement les deux. Néanmoins, pour mettre les choses en perspective, la machine la plus puissante du top 500, la Chinoise TaihuLight, fournit 12,5 % de la puissance totale.

Sources : Swiss Deploy World’s Fastest GPU-Powered Supercomputer, U.S. Slips in New Top500 Supercomputer Ranking.

La nouvelle structure d’interconnexion des cœurs d’Intel est maillée

Les derniers processeurs d’Intel, tant pour le grand public (gamme i9) que pour les entreprises (Xeon), proposent un très grand nombre de cœurs : les i9 montent jusque dix-huit cœurs sur une même puce, les Xeon vingt-huit. Cependant, à l’intérieur de chaque puce, les cœurs étaient jusqu’il y a peu connectés de la même manière qu’en 2008, avec une architecture circulaire prévue pour huit cœurs au plus. Cette dernière faisait sentir ses limites, tant en termes de latence que de bande passante ou de consommation énergétique. C’est pourquoi la génération qui arrive très bientôt sur le marché profitera d’un changement très profond : cet anneau est remplacé par des mailles. Ce changement est annoncé plus tardivement qu’AMD, dont l’Infinity Fabric avait été annoncé début 2016, bien avant la confirmation des plans de processeurs de trente-deux cœurs et plus.

En 2008, Intel lance une nouvelle gamme de processeurs grand public sous la marque Core i, avec une révolution : la présence de plusieurs cœurs. Désormais, il faut donc partager le contrôleur mémoire, les accès au matériel (lignes PCIe et autres), etc. entre plusieurs unités de calcul. Une solution simple et relativement efficace est de relier tous ces éléments dans un anneau (inspiré des premiers réseaux informatiques). Pour limiter les délais, celui-ci est doublé : un anneau dans chaque sens. Chacun des éléments y est connecté, ce qui permet à tous les cœurs d’accéder à tous les éléments importants.

Cependant, au vu de la fréquence des processeurs, on ne peut pas considérer que l’information se propage infiniment vite. Par conséquent, pour assurer une certaine synchronisation du signal, les données ne peuvent se propager qu’un élément de l’anneau plus loin par coup d’horloge. Chaque cœur y est connecté indépendamment, mais tous les éléments ne sont pas logés à la même enseigne : par exemple, les accès au matériel externe doivent se partager un point d’accès à l’anneau.

S’il faut connecter plus de cœurs, les transmissions deviennent bien trop lentes, vu le nombre d’éléments connectés à l’anneau : si l’envoi d’un paquet d’information au cœur voisin peut se faire en un coup d’horloge, le plus éloigné peut prendre une dizaine coups, pour huit cœurs ; avec une vingtaine de cœurs, cette solution n’est pas adaptée. Dans ce cas, l’anneau peut être doublé, avec une architecture d’interconnexion des deux anneaux. Chaque anneau peut avoir son propre contrôleur mémoire, pour éviter de ralentir ces accès — nettement plus fréquents que les échanges entre cœurs. Néanmoins, la communication entre deux cœurs peut prendre nettement plus de temps, si chacun des deux cœurs est dans son propre anneau et loin des interconnexions.

Cette architecture ne peut plus s’adapter aux processeurs avec un grand nombre de cœurs sans limiter leur performance. Pour cette génération à venir, l’anneau a complètement disparu : maintenant, tous les éléments sont reliés dans une grille, la communication peut se faire selon un bien plus grand nombre de chemins (si certains sont déjà très chargés). De telle sorte, la latence peut être fortement réduite ; vu le nombre de liens supplémentaires, la bande passante augmente également.

Les mêmes inégalités que précédemment sont répétées, mais amoindries : un cœur proche du contrôleur mémoire aura accès nettement plus rapidement à la mémoire qu’un cœur en plein milieu de la grille. Ainsi, un cœur situé au centre aura intérêt à collaborer avec les cœurs voisins, tandis que ceux proches des contrôleurs auront intérêt à préparer l’information pour les autres cœurs. Il n’y a néanmoins plus d’intérêt à communiquer avec les cœurs dans le même anneau.

Par rapport à la génération précédente, cependant, on peut positionner nettement plus de contrôleurs mémoire sur les côtés (la structure en anneaux était limitée à un contrôleur par anneau) : par exemple, les Xeon à vingt-huit cœurs en auront trois de chaque côté. En effet, ajouter des points d’arrêt dans la grille n’augmente pas les délais pour toutes les communications. Même chose pour les accès au matériel extérieur : ces Xeon auront droit à deux points d’accès pour les lignes PCIe, ce qui augmentera les débits potentiels depuis et vers les cartes graphiques, les SSD ou le réseau (surtout en fibre optique, avec des pointes à cent gigabits par seconde).

Globalement, Intel indique avoir pu diminuer la fréquence et la tension sur les bus de communication de cette grille par rapport aux anneaux tout en augmentant la bande passante totale et en diminuant la latence (sans avancer de chiffre, toutefois) : c’est donc une bonne nouvelle, puisque la consommation “inutile” des processeurs diminuera — cette puissance pourra donc être consommée par les cœurs de calcul directement.

Cette nouvelle architecture s’imposera dans tous les processeurs à venir du fondeur s’ils disposent d’un grand nombre de cœurs — l’architecture en anneau étant largement suffisante pour les processeurs les plus courants, jusque huit cœurs. Elle n’a probablement pas été dictée par AMD, mais est plutôt en développement depuis deux à trois ans — ce qui n’empêche qu’elle tombe très bien, d’un point de vue commercial. Il restera à voir comment elle s’adaptera dans les années à venir avec encore plus de cœurs par puce… mais déjà comment elle fonctionne maintenant, par rapport aux anneaux.

Sources et images : Intel Introduces New Mesh Architecture For Xeon And Skylake-X Processors, Intel Skylake-X and Skylake-SP Mesh Architecture For XCC “Extreme Core Count” CPUs Detailed – Features Higher Efficiency, Higher Bandwidth and Lower Latency.

ARM annonce sa nouvelle génération de processeurs : les Cortex A75 et A55 et le processeur graphique Mali G72

ARM est à la fois une société qui conçoit (mais ne fabrique pas) des processeurs et le nom de l’architecture de ces processeurs. Elle vend donc des blocs que d’autres sociétés peuvent intégrer aux processeurs qu’elles fabriquent (comme Samsung pour ses Exynos et certains processeurs de Qualcomm), de telle sorte qu’elles peuvent développer des processeurs complets très rapidement, le travail ayant été prémâché par ARM. (D’autres sociétés, comme Apple ou Qualcomm, préfèrent n’utiliser que les instructions ARM et concevoir complètement leurs processeurs de zéro.)

Fin mai, la société a annoncé deux nouveaux blocs de processeur : les Cortex A75 (optimisé pour la performance; qui succède au A73) et A55 (optimisé pour la consommation énergétique, qui succède au A53 de 2012). La société est organisée pour produire de nouveaux cœurs variés quant à leurs utilisations possibles avec une cadence élevée (de nouvelles conceptions chaque année dans chaque segment), les deux processeurs n’ont pas grand-chose en commun dans leurs détails — ce qui n’empêche de combiner plusieurs cœurs de chaque type dans un processeur haut de gamme, pour bénéficier d’une faible consommation quand les besoins en puissance ne sont pas énormes, mais avec toujours plus de puissance de calcul sous le capot.

Cortex A55 : une augmentation de performance et de l’efficacité énergétique

L’A55 est un cœur de calcul assez petit, incapable de réordonner les instructions qu’il effectue (contrairement aux cœurs plus gros, qui changent l’ordre des instructions pour utiliser au mieux leur architecture). Le point noir de l’architecture précédente était le système mémoire, qui limitait la partie de calcul pur. Ainsi, ARM a repensé le module de préchargement depuis la mémoire (la lecture est complètement séparée de l’écriture), mais a aussi intégré un cache L2 plus près de la partie calcul, l’objectif étant de réduire la latence de 50 % lors d’un accès direct en mémoire (un changement lié à DynamIQ, voir plus loin). Un cache L3 a aussi été ajouté. L’effet est immédiat : sur un test de copie de mémoire (LMBench), le temps d’exécution est presque divisé par deux. Les autres améliorations concernent principalement le prédicteur de branchement.

Globalement, d’après les chiffres d’ARM, à fréquence égale, un cœur A55 gagne 18 % en performance par rapport à son prédécesseur pour des opérations sur des nombres entiers (SPECint) et même 38 % avec des nombres à virgule flottante (SPECfp). Lors de tests plus réalistes, ce cœur a un score 21 % plus élevé au test Geekbench v4, 14 % pour Octane v2. En pratique, l’augmentation de performance devrait être plus importante, vu que la comparaison se voulait aussi égale que possible (même taille des caches L1, L2, pas de cache L3, fréquence égale, même compilateur, etc.), ce qui a obligé à désactiver certaines fonctionnalités de l’A55.

 

La consommation d’énergie est presque constante, avec une augmentation de 3 % — mais, en pratique, elle sera plus faible à performance égale, grâce aux nombreuses améliorations apportées. Ainsi, l’efficacité énergétique augmente de 15 % pour SPECint.

Cortex A75 : une même consommation pour une meilleure performance

L’A75 est un cœur bien plus gros que l’A55, ce qui lui permet d’effectuer un prétraitement plus poussé avant l’exécution du code. Ainsi, par rapport au A73, il peut décoder trois instructions par cycle (au lieu de deux). Il n’y a pas plus d’unités de calcul, mais plus de files pour stocker les microopérations à effectuer : ainsi, on passe de six microopérations effectuées à huit par cycle. Côté NEON (pour des instructions effectuant la même opération sur une série de valeurs à la fois — c’est le principe du SIMD, implémenté côté x86 par les instructions SSE et AVX), les changements sont similaires, avec cependant une troisième unité de calcul, dédiée aux accès à la mémoire.

Globalement, l’augmentation de performance est perceptible, que ce soit sur des tests synthétiques (22 % d’augmentation pour SPECint, 33 % pour SPECfp, 16 % pour LMBench) ou réels (48 % sur Octane v2, 34 % sur Geekbench v4).

DynamIQ, le nouveau nom de big.LITTLE

Pour améliorer la consommation énergétique des processeurs de ses clients tout en proposant un haut niveau de performance, ARM a développé ces dernières années big.LITTLE. Cette technologie permet de rassembler plusieurs cœurs différents (A53 et A73, par exemple) et de les activer et désactiver selon la charge de calcul : les cœurs sont rassemblés dans deux grappes (de maximum quatre cœurs), l’une ou l’autre étant choisie selon les calculs à effectuer. En d’autres termes, l’hétérogénéité était assez limitée, puisqu’on avait une grappe de cœurs peu puissants (LITTLE) et l’autre de cœurs plus puissants (big), sans solution intermédiaire. Des implémentations plus complexes n’avaient pas cette limitation et pouvaient exploiter tous les cœurs des deux grappes simultanément — mais les grappes doivent rester homogènes.

Les besoins ont continué d’évoluer, ce qui a rendu big.LITTLE problématique pour l’évolution future, d’où DynamIQ : l’objectif est d’avoir une technologie plus flexible, qui permet d’utiliser plus de cœurs (potentiellement plus spécialisés), tout en augmentant la performance.

Les Cortex A55 et A75 sont spécifiquement prévus pour exploiter au mieux DynamIQ. Ainsi, chaque cœur possède ses caches L2 privés, très près des parties effectuant les calculs, pour une performance optimale. Les caches L3, au contraire, sont partagés au niveau d’une grappe, de telle sorte qu’une tâche peut passer d’un cœur à l’autre d’une même grappe sans devoir trop accéder à la mémoire externe à la grappe (forcément lente).

Ces grappes peuvent alors être interconnectées : avec huit cœurs par grappe, trente-deux grappes par puce, on peut encore monter avec une interconnexion CCIX entre puces. Chaque cœur de chaque grappe peut être désactivé individuellement — même si la fréquence doit être identique pour tous les cœurs activés d’un même “domaine”, prédéfini à l’avance par le constructeur (les huit cœurs d’une grappe peuvent cependant avoir chacun leur domaine, dans une implémentation plus complexe : chaque domaine doit avoir son propre régulateur de tension pour gérer la fréquence).

Mali G72 : des améliorations itératives

Finalement, ARM a aussi annoncé un nouveau processeur graphique, le G72. L’objectif est multiple : s’adapter aux nouveaux besoin en puissance (des jeux mobiles avec une haute fidélité de rendu) et aux nouvelles applications (apprentissage automatique et réalité virtuelle). Le G72 n’apporte pas une architecture complètement renouvelée (c’était le cas du G71, avec l’architecture Bifrost), mais bien améliorée sur certains points particuliers.

Les améliorations se concentrent sur des détails, qui ont toutefois leur importante : l’efficacité énergétique est ainsi améliorée de 25 %, la densité de performance de 20 % (c’est-à-dire une augmentation de performance de 40 % à surface et à consommation équivalente).

Ainsi, certaines instructions trop complexes et peu souvent utilisées ont été retirées et remplacées par plusieurs instructions, qui prennent donc plus de cycles — en diminuant la complexité du processeur. L’impact en performance est négligeable, puisque ces instructions sont peu utilisées. Au contraire, certaines instructions complexes ont été optimisées dans le cadre des opérations graphiques (ne respectant pas forcément la norme IEEE 754 : ces variations des instructions ne sont pas impactées).

Cependant, la plupart des gains en performance viennent plutôt des caches, tous quelque peu impactés : les caches L1, d’écritures et de temporisation des tuiles sont plus grands ; la logique des caches d’instruction a été améliorée pour limiter les défauts et donc les accès directs en mémoire. L’effet principal est donc de réduire les besoins en bande passante du GPU : cela tombe bien, les opérations en mémoire sont parmi les plus énergivores.

Grâce à ces gains, pour une performance équivalente, on pourra utiliser moins de cœurs G72 et donc gagner en place sur le processeur (ce qui en diminue le coût) ; ceux qui ont besoin de meilleures performances pourront mettre plus d’unités de calcul sur une même surface, ce qui est aussi avantageux.

Sources et images : Exploring DynamIQ and ARM’s New CPUs: Cortex-A75, Cortex-A55, ARM Announces Mali-G72: Bifrost Refined for the High-End SoC.

 

Une nouvelle manière d’utiliser du code CUDA sur d’autres architectures : le projet Coriander

NVIDIA CUDA est et reste la technologie de choix pour l’utilisation de processeurs graphiques pour des calculs. Pour ainsi dire, toutes les bibliothèques d’apprentissage profond utilisent CUDA pour accélérer leurs calculs (pour la plupart, exclusivement) : TensorFlow, Caffe, Torch, Theano, etc. — même si quelques rares bibliothèques s’opposent à cette hégémonie, comme DeepCL. Cependant, cela pose un gros problème à l’écosystème : CUDA est limité aux processeurs fournis par NVIDIA, ce qui limite la concurrence.

C’est notamment pour cela qu’AMD a lancé le projet de transpilateur HIP, qui vise à transformer du code source CUDA en OpenCL. L’outil est vraiment prévu pour que le code source CUDA ne soit plus utilisé, qu’OpenCL le remplace sur toutes les plateformes — malgré les possibilités d’optimisation possibles uniquement avec CUDA pour les processeurs NVIDIA. Un défaut est que toutes les possibilités du langage CUDA ne sont pas gérées. Certains projets, comme Caffe ou Torch, ont lancé une opération de conversion manuelle, qui a le même genre de défauts : le développement se produit principalement en CUDA, pas en OpenCL.

Pour améliorer la situation, certains développeurs se sont lancés dans le projet Coriander (anciennement connu sous le nom de CUDA-on-CL) : ils agissent au moment de la compilation, pas sur les sources. Ainsi, un projet peut être développé entièrement avec CUDA, mais être portable sur toutes les architectures de processeurs graphiques (et d’autres plateformes compatibles OpenCL).

Le principe est proche de HIP : le code CUDA est compilé normalement avec Clang ; ensuite, Coriander traduit le code intermédiaire LLVM en code OpenCL 1.2, qui peut alors être recompilé pour n’importe quelle cible. La partie restante est alors l’API CUDA, qui permet de gérer finement l’exécution sur les processeurs, mais ce travail est actuellement moins abouti. La force de CUDA réside non seulement dans le langage de programmation des GPU, mais aussi dans les bibliothèques de fonctions courantes déjà implémentées et optimisées : pour ce faire, des parties considérables de cuBLAS et cuDNN ont déjà été portées.

À l’exécution, le code produit est moins performant que s’il était directement exécuté sur un GPU NVIDIA. Cependant, pour des tâches d’apprentissage profond, selon le type d’opérations à effectuer, les résultats peuvent être très proches de ceux de CUDA (opérations unitaires, tangente hyperbolique) ; d’autres sont clairement en-dessous (réductions). Cela est en bonne partie dû aux optimisations effectuées par les compilateurs de NVIDIA, mais aussi au fait que le projet Coriander génère du code OpenCL pas forcément traditionnel (afin de coller au mieux à la sémantique de CUDA et éviter des problèmes de correction).

Voir le code source de Coriander.

Source : présentation à IWOCL.

Des nouvelles de Flang, le compilateur Fortran basé sur LLVM

Après un an et demi de travaux, le compilateur Fortran basé sur LLVM promis par NVIDIA arrive enfin sur GitHub, bien que sans annonce officielle. Le projet a commencé avec un étudiant (financé par le programme Google Summer of Code) en 2013 sous le nom de Flang (analogue de Clang, le compilateur LLVM pour le C et ses dérivés), puis a été repris par NVIDIA et la sécurité nucléaire du département américain en 2015. L’objectif était de fournir un compilateur libre de très haute qualité, notamment basé sur celui de PGI.

Avec le développement de LLVM, ce projet apporte de plus en plus de promesses à l’écosystème Fortran. Par exemple, LLVM permet de compiler du code pour les GPU NVIDIA : grâce à Flang, il sera très facile d’offrir un compilateur libre pour ce faire (sans devoir utiliser celui de PGI). Également, OpenMP permet de décharger l’exécution du code sur un accélérateur : GCC ne le permet pas encore pour des cartes graphiques, uniquement les coprocesseurs Intel Xeon Phi ;  LLVM, quant à lui, gère les cartes NVIDIA et les coprocesseurs Intel Xeon Phi.

Pour le moment, Flang fonctionne avec LLVM 3.9 (presque la dernière version). Les sources de la version 1.0 sont en ligne depuis une semaine (avec des commits d’employés de NVIDIA et de PGI), mais aucune annonce officielle n’a encore été faite (la documentation fait référence à un site qui n’existe pas encore, http://flang.nvidia.com/). La norme Fortran 2008 est implémentée, mais aucune information n’est donnée sur le niveau de compatibilité (le compilateur de PGI n’implémente pas toute la norme). La grande différence par rapport au compilateur de PGI devrait être la qualité des messages d’erreur, du niveau de Clang.

Annonce de CUDA 9

Parallèlement à ses derniers GPU (de génération Volta), NVIDIA annonce une nouvelle version de son API CUDA. Cette neuvième itération se concentre sur les nouvelles fonctionnalités des GPU annoncés, mais propose également de nouveaux algorithmes dans cuSolver et nvGraph, ainsi qu’un compilateur amélioré — plus rapide, compatible avec le code C++14 pour l’hôte — et une intégration pour les environnements de programmation les plus récents — Visual Studio 2017, Clang 3.9, PGI 17.1 et GCC 6.

Groupes coopératifs

Les algorithmes parallèles imposent souvent aux fils d’exécution de travailler de manière collective (et non parfaitement en parallèle et sans synchronisation), ce que le développeur peut faire en groupant certains et en synchronisant ces groupes. CUDA 9 apporte justement cette notion de groupes coopératifs.

De manière historique, le degré le plus fin de découpage des fils d’exécution est le bloc, qui correspond à une limite physique des premiers GPU entièrement programmables. La synchronisation ne pouvait ainsi se faire qu’entre ces blocs. Cette manière de programmer est difficile à bien assimiler et limite la performance. De plus, les interactions avec les bibliothèques extérieures sont plus compliquées.

Au contraire, un groupe coopératif est une subdivision plus fine du travail à effectuer, qui peut correspondre à un morceau de bloc ou à plusieurs blocs… voire plusieurs GPU. Les opérations collectives peuvent alors s’effectuer par rapport à ces groupe. Ainsi, le nombre de fils d’exécution par bloc peut varier pour s’adapter au matériel (et donc en extraire un maximum de performance), tandis que la synchronisation n’en pâtit pas.

Cette fonctionnalité est disponible sur toutes les générations de processeurs graphiques, mais pas tous les détails. Ainsi, la synchronisation entre GPU n’est possible qu’avec les processeurs Pascal et Volta, en-dessous d’une trame d’exécution uniquement avec Volta (grâce à un ordonnancement des fils d’exécution entièrement repensé).

Outils pour développeurs

Le profileur visuel a reçu deux améliorations majeures pour faciliter l’analyse de la performance des applications utilisant la mémoire unifiée. D’un côté, il montre maintenant les lignes de code où se produit chaque défaut de page du côté CPU (et donc où l’exécution du code doit être interrompue le temps de charger la zone de mémoire demandée).

De l’autre, la ligne du temps du profileur affiche trois types d’événements liés à l’utilisation de la mémoire unifiée :

  • les goulots d’étranglement (page throttling) qui se produisent quand un processeur est bloqué sur une page de mémoire le temps pour laisser un autre y accéder sans interruption ;
  • les écroulements (thrashing) qui indiquent qu’au moins deux processeurs accèdent à une même région en mémoire virtuelle à tour de rôle, ce qui fait que les pages concernées sont déplacées sans cesse d’un processeur à l’autre ;
  • une correspondance éloignée (remote map) pointe une région en mémoire virtuelle qui a été assignée à un autre processeur, notamment pour éviter un écroulement ou pour combler un manque de mémoire sur le processeur courant.

Cœurs tensoriels

Volta est la première architecture GPU de NVIDIA à fournir tant des cœurs de calcul génériques (CUDA) que spécifiques (tensoriels). Ces derniers sont prévus spécifiquement pour une opération : un cœur tensoriel peut mémoriser quatre matrices de seize éléments et effectuer l’opération D = A × B + C.

Chacun de ces cœurs effectue soixante-quatre opérations de multiplication-addition par coup d’horloge. Rassemblés dans une trame d’exécution, ils peuvent effectuer cette opération de multiplication et d’addition entre seize matrices carrées de seize éléments de côté. En continuant d’assembler ainsi les groupes de cœurs, on peut traiter des matrices de n’importe quelle taille, extrêmement rapidement. La principale limitation concerne la précision : les deux matrices à multiplier sont forcément FP16, tandis que les deux matrices d’accumulation peuvent être FP16 ou FP32.

Source et détails : CUDA 9 Features Revealed: Volta, Cooperative Groups and More.