11.4.3.3.1 : La fin des certitudes


À l'intérieur d'un nœud de calcul, il existe une vérité universelle accessible à tous les programmes en cours d'exécution~: le contenu de la mémoire partagée.

Certes, cette vérité change tout le temps, et d'une manière qui peut être difficile à appréhender. Mais en maniant bien la synchronisation, il devient presque trivial de mettre deux threads d'accord sur quelque chose, et l'on peut entretenir le sentiment confortable d'avoir à chaque instant une vision d'ensemble du calcul, dont on peut facilement exposer chaque facette aux threads selon leurs besoins.

Malheureusement, l'accession au rang de calcul distribué, Graal du passage à l'échelle promettant à ses fidèles l'accès au nirvana du parallélisme inépuisable, implique le rite de passage du renoncement à ces conforts matériels.

Dans une infrastructure de calcul distribué, chaque nœud de calcul n'a accès qu'à une partie du jeu de données qui définit le problème. À chaque fois qu'il veut avoir accès à des données situées sur un autre nœud, il doit en discuter avec lui en lui envoyant un message par un réseau qui semble toujours trop lent, en latence comme en débit, et ayant la fâcheuse habitude de distribuer les communications dans un ordre différent que celui dans lequel elles ont été émises.

À la suite de quoi, avec un peu de chance, son interlocuteur répondra au bout d'un temps qui aura semblé durer une éternité. À moins bien sûr qu'il ne réponde jamais, bloqué dans l'attente d'un message d'un autre nœud, qui refuse de lui envoyer, car il attend d'abord un message de lui en raison d'un décalage mal géré entre la valeur de leurs horloges système respectives.

Vous l'aurez compris, il existe quelques différences conceptuelles entre le parallélisme en mémoire partagée (ou multi-cœur) et le parallélisme distribué (ou multi-nœud) qui doivent être prises en compte pour l'écriture de calculs distribués corrects et performants.