11.4.3.3.3 : Du paquet au message
La situation décrite précédemment donnera à tout programmeur le désir compréhensible de cacher la complexité et variabilité matérielle derrière une abstraction logicielle simplificatrice. Cependant, comme toujours, le premier niveau d'abstraction au-dessus du matériel doit être conçu avec prudence, et être avant tout une aide à la portabilité logicielle n'empêchant pas l'écriture d'un code performant.
Sur ce point, l'abstraction système classique du socket se révèle hélas peu adaptée au calcul haute performance~:
- Les modèles de communication proposés, comme le flux d'octets fiable continu, n'incluent pas des schémas de communication extrêmement répandus en calcul comme les messages fiables de taille variable. Ceux-ci doivent donc être réimplémentés par un protocole d'ordre supérieur, avec potentiellement un coût en bande passante réseau lié à une double encapsulation des données.
- Par construction, l'API socket nécessite un grand nombre de copies de données entre l'application et le stockage interne du système d'exploitation, qui ont un coût en capacité et bande passante RAM.
- Toutes les opérations nécessitent également l'utilisation d'appels systèmes et d'interruptions matérielles, dont le coût devient important lorsqu'ils se produisent un très grand nombre de fois par seconde.
- La communication asynchrone, essentielle à une bonne gestion de la latence réseau, est à la fois difficile d'utilisation et peu portable, non seulement entre systèmes d'exploitation mais aussi parfois entre versions d'un même système d'exploitation. En effet, les APIs associées évoluent encore vite par rapport aux versions du noyau Linux utilisées dans les centres de calcul.
Pour toutes ces raisons, il est souvent nécessaire de remplacer les abstractions système standard par d'autres plus adaptés aux besoins de la communication haute performance. Un exemple de ce type d'abstraction est LibFabric[68]LibFabrix : Open Fabrics Interfaces (OFI), OFI Working Group.
Par-dessus cette première couche d'abstraction, on peut ensuite fournir un deuxième niveau d'abstraction répondant de façon plus directe à des besoins applicatifs courants, au prix d'une généralité moindre. Dans le milieu des super-calculateurs, l'abstraction la plus utilisée est l'interface standardisée MPI[63]Open MPI : A High Performance Message Passing Library, MPI Group, pour Message Passing Interface.
Comme son nom l'indique, cette interface se concentre principalement sur la transmission ordonnée et fiable de messages de taille arbitraire entre nœuds de calcul. Elle permet à l'application d'échanger des blocs de données typés de différentes manières~: communication bloquante ou non-bloquante, point à point ou collective, avec l'ensemble du système ou à un sous-groupe... mais elle fournit aussi d'autres fonctionnalités importantes comme un outillage pour la création et l'adressage de processus sur les nœuds de calcul, une introspection de la topologie du réseau, un support des débogueurs et profileurs, et une gestion entrées/sorties de fichiers adaptée aux systèmes de fichiers distribués.
En dehors du monde du calcul intensif, d'autres outils pour l'échange de messages sont plus répandus, par exemple la bibliothèque multi-langages ZeroMQ[125]ZeroMQ - An open-source universal messaging library, The ZeroMQ authors. Si ces outils sont un peu moins adaptés aux besoins du calcul que MPI, ils ont néanmoins le grand avantage de s'adapter bien plus facilement aux infrastructures de calcul autres que les super-calculateurs. En effet, l'installation et la maintenance d'une infrastructure MPI nécessite un savoir-faire administratif très spécifique qui est peu rencontré en dehors de la communauté HPC.