Perspective historique
Il est vraiment impossible de dire à quoi ressembleront les nouveaux paradigmes à l'avenir, par exemple une bonne perspective historique que je suggère de lire dans Rise and Fall of HPF de Ken Kennedy . Kennedy donne un aperçu de deux modèles émergents, MPI par rapport à un compilateur intelligent, et explique en détail comment MPI avait le nombre approprié d'adopteurs précoces et la flexibilité nécessaire pour dominer. HPF a finalement résolu ses problèmes mais il était trop tard.
À bien des égards, plusieurs paradigmes, tels que PGAS et OpenMP, suivent cette même tendance HPF. Les premiers codes n'étaient pas assez flexibles pour être utilisés correctement et laissaient beaucoup de performances sur la table. Mais la promesse de ne pas avoir à écrire chaque iota de l’algorithme parallèle est un objectif attrayant. La recherche de nouveaux modèles se poursuit donc toujours.
Tendances claires en matière de matériel
Maintenant, le succès de MPI a souvent été cité comme étant étroitement lié à la manière dont il modélise le matériel sur lequel il fonctionne. En gros, chaque nœud a un nombre limité de processus et la transmission des messages à des points de contact locaux ou par le biais d'opérations collectives coordonnées s'effectue facilement dans l'espace du cluster. Pour cette raison, je ne fais confiance à personne qui donne un paradigme qui ne suit pas de près les nouvelles tendances du matériel, j'ai été convaincu de cette opinion par le travail de Vivak Sarakar .
Dans cette optique, trois tendances sont clairement en train de progresser dans les nouvelles architectures. Et laissez-moi être clair, il y a maintenant douze architectures différentes commercialisées dans HPC. Cela remonte à moins de 5 ans et ne comportait que x86, alors les prochains jours verront beaucoup d'opportunités pour utiliser le matériel de manières différentes et intéressantes.
- Puces à usage spécial: pensez aux grandes unités vectorielles comme les accélérateurs (vue adoptée par Bill Dally de Nvidia)
- Puces à faible consommation d'énergie: grappes basées sur ARM (pour gérer les budgets de puissance)
- Carrelage de puces: pensez au carrelage de puces avec des spécifications différentes (travail d' Avant Argwal )
Modèles actuels
Le modèle actuel a 3 niveaux de profondeur. Bien que de nombreux codes utilisent bien deux de ces niveaux, peu d’entre eux ont été utilisés. Je crois que pour arriver d'abord à exascale, il faut investir pour déterminer si votre code peut fonctionner aux trois niveaux. C’est probablement la voie la plus sûre pour bien réitérer les tendances actuelles.
Permettez-moi de parcourir les modèles et la façon dont ils devront changer en fonction des nouvelles vues matérielles prévues.
Distribué
Les acteurs du niveau distribué tombent en grande partie dans les langues MPI et PGAS. MPI est clairement gagnant à l'heure actuelle, mais les langages PGAS tels que UPC et Chapel progressent dans l'espace. Le HPC Benchmark Challenge est une bonne indication. Les langages PGAS donnent des implémentations très élégantes des repères.
Le point le plus intéressant ici est que, même si ce modèle ne fonctionne actuellement qu’au niveau des nœuds, ce sera un modèle important au sein d’un nœud pour les architectures en mosaïque. Une indication est la puce Intel SCC, qui a fondamentalement agi comme un système distribué. L'équipe SCC a créé sa propre implémentation MPI et de nombreuses équipes ont réussi à transférer des bibliothèques de communauté vers cette architecture.
Mais pour être honnête, PGAS a vraiment une bonne histoire à jouer dans cet espace. Souhaitez-vous vraiment programmer l'internode MPI et que vous ayez à faire la même astuce intranode? Un gros problème avec ces architectures en mosaïque est qu’elles auront des vitesses d’horloge différentes sur les puces et des différences majeures de largeur de bande vers la mémoire; les codes performants doivent donc en tenir compte.
Mémoire partagée sur le nœud
Nous voyons ici que MPI est souvent "assez bon", mais les PThreads (et les bibliothèques dérivées de PThreads tels que Intel Parallel Building Blocks) et OpenMP sont encore souvent utilisés. L’opinion courante est qu’il y aura un moment où il y aura suffisamment de threads de mémoire partagée pour que le modèle de socket de MPI tombe en panne pour RPC ou vous avez besoin d’un processus plus léger fonctionnant sur le noyau. Vous pouvez déjà voir les indications selon lesquelles les systèmes IBM Bluegene rencontrent des problèmes avec la mémoire partagée MPI.
Comme Matt commente, la plus grande amélioration des performances des codes intensifs de calcul est la vectorisation du code série. Si de nombreuses personnes supposent que cela est vrai pour les accélérateurs, cela est également essentiel pour les machines sur nœud. Je crois que Westmere a une FPU large de 4, donc on ne peut avoir qu'un quart des flops sans vectorisation.
Bien que je ne vois pas OpenMP actuel entrer dans cet espace, il y a une place pour les puces de faible puissance ou les tuiles pour utiliser des threads plus légers. OpenMP a du mal à décrire le fonctionnement du flux de données et, à mesure que davantage de threads sont utilisés, je ne vois que cette tendance devenir de plus en plus exagérée. Il suffit de regarder quelques exemples de ce que l’on doit faire pour obtenir un prélecture adéquat avec OpenMP.
OpenMP et PThreads à un niveau de cours suffisant peuvent tirer parti de la vectorisation nécessaire pour obtenir un bon pourcentage de pic, mais cela nécessite de décomposer vos algorithmes de manière à ce que la vectorisation soit naturelle.
Co-processeur
Enfin, l’émergence du co-processeur (GPU, MIC, accélérateurs de cellules) s’est installée. Il devient de plus en plus évident qu’aucun chemin menant à exascale ne sera complet sans eux. À la SC11, tous les participants au prix Bell les utilisaient très efficacement pour atteindre les bas pétaflops. Tandis que CUDA et OpenCL dominent le marché actuel, j’espère que les compilateurs OpenACC et PGAS entreront dans l’espace.
Maintenant, pour arriver à exascale, une proposition consiste à coupler les puces de faible puissance à de nombreux co-processeurs. Cela va plutôt bien tuer la couche intermédiaire de la pile actuelle et utiliser des codes qui gèrent les problèmes de décision sur la puce principale et alourdir le travail des co-processeurs. Cela signifie que pour que le code fonctionne assez efficacement, une personne doit repenser les algorithmes en termes de noyaux (ou de codelets), c'est-à-dire des fragments parallèles de niveau d'instruction sans branche. Autant que je sache, une solution à cette évolution est plutôt ouverte.
Comment cela affecte le développeur de l'application
Passons maintenant à votre question. Si vous souhaitez vous protéger de la complexité imminente des machines Exascale, vous devez prendre certaines mesures:
- Développez vos algorithmes pour s’adapter à au moins trois niveaux de hiérarchie parallèle.
- Concevez vos algorithmes en termes de noyaux pouvant être déplacés entre les hiérarchies.
- Détendez-vous pour tous les processus séquentiels, tous ces effets se produiront de manière asynchrone car l’exécution synchrone n’est tout simplement pas possible.
Si vous voulez être performant aujourd'hui, MPI + CUDA / OpenCL est suffisant, mais UPC y parvient. Ce n'est donc pas une mauvaise idée de prendre quelques jours et de l'apprendre. OpenMP vous permet de démarrer mais génère des problèmes lorsque le code doit être refactorisé. PThreads nécessite de réécrire complètement votre code dans son style. Ce qui fait de MPI + CUDA / OpenCL le meilleur modèle actuel.
Ce qui n'est pas discuté ici
Bien que toutes ces discussions sur exascale soient bonnes, quelque chose qui n’a pas vraiment été abordé ici est d’obtenir des données sur et hors des machines. Bien que de nombreux progrès aient été réalisés dans les systèmes de mémoire, nous ne les voyons pas dans les grappes de produits (trop chères). Maintenant que l'informatique à forte intensité de données occupe une place importante dans toutes les conférences de super-informatique, il y aura certainement un mouvement plus important dans l'espace de bande passante mémoire élevée.
Cela porte à l’autre tendance qui pourrait se produire (si les bons organismes de financement s’impliquent). Les machines vont devenir de plus en plus spécialisées pour le type d'informatique requis. Nous voyons déjà des machines «à forte intensité de données» financées par la NSF, mais ces machines sont sur une piste différente de celle du Grand Challenge Exascale 2019.
Cela est devenu plus long que prévu demander des références où vous en avez besoin dans les commentaires