La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Supports d’exécution pour grappes de machines SMP

Présentations similaires


Présentation au sujet: "Supports d’exécution pour grappes de machines SMP"— Transcription de la présentation:

1 Supports d’exécution pour grappes de machines SMP
Raymond Namyst Projet INRIA ReMaP LIP, ENS Lyon

2 Plan Multithreading Exploitation efficace des machines SMP
Introduction et rappels Exploitation efficace des machines SMP Ordonnancement mixte, activations Multithreading distribué Modèles de programmation Intégration des threads et des communications Conclusion Pas si simple…

3 Introduction et rappels
Multithreading Introduction et rappels

4 Rappel : les processus lourds
Caractéristiques Entité active directement supportée par l’OS Flot d’exécution Espace d’adressage privé Ressources systèmes Exécution séquentielle Coût de gestion élevé Allocation des ressources Appels systèmes

5 Processus lourds Ressources “noyau” + données “utilisateur”
Espace utilisateur Processus Processus Processus Ordonnanceur Noyau processeur

6 Threads : Motivations Difficulté de programmation Performances
Fil d’exécution unique  une seule chose à la fois ! Partage de données laborieux Réactivité aux sollicitations externes Performances Opérations de base coûteuses Recouvrement des opérations d’E/S difficiles

7 Simplicité de programmation
Objectif Mener plusieurs activités indépendantes au sein d’un processus Exemples Simulations Serveurs de fichiers Systèmes d’exploitation (!) Seule solution (?) Automate à états finis implanté « à la main » (sauvegardes d’états)

8 Structure d’un OS monolytique
Exemple Séquence infinie d’opérations courtes Ordre et fréquence des scrutations ? for (;;) { if(networkMsgIn()) getNetworkMsg(); if(kbdReady()) getKey(); if(diskBlockReady()) handleDiskBlock(); }

9 Systèmes multiprogrammés
Exécution indépendante des activités Concurrence entre les différents traitements for (;;) { wait for key stroke; getKey(); } for (;;) { wait for network msg; getNetworkMsg(); } for (;;) { wait for disk block; handleDiskBlock(); }

10 Processus serveur classique
Sérialisation des requêtes Pas de recouvrement des E/S Exploitation SMP délicate Prise en compte de priorités ? client serveur OS OS

11 Sur l’efficacité des E/S
Caractéristiques du serveur de fichiers Tps de traitement d’une requête = 15ms Tps supplémentaire pour l’accès disque = 75ms (pour 1/3 des requêtes) Débit sans/avec recouvrement des E/S Sans recouvrement 25 requêtes/seconde Avec recouvrement 33.33 requêtes/seconde (+33%)

12 Les processus légers Principe
Détacher flot d’exécution et ressources Introduits dans divers langages & systèmes Programmation concurrente Recouvrement des E/S Exploitation des architectures SMP thread ressources

13 Caractéristiques de base
Thread = pile + contexte Partage de ressources Code, tas, … : espace d’adressage Fichiers ouverts Etc. Opérations de base performantes Création, destruction Synchronisation, commutation de contextes Création d’un processus léger Adresse de fonction à exécuter + paramètres

14 Performance des threads
Opérations critiques Création/destruction (gestion mémoire) Changement de contexte (temps-partagé) Synchronisation (mode utilisateur) Programme d’évaluation Création d’une activité (processus, thread) + synchronisation (terminaison de l’activité) OS/Processeur Processus Thread noyau Thread utilisateur PM2 Linux 2.2/PII 450 0.540 0.130 - 0.006 Solaris 2.7/PII 350 8.622 0.214 0.160 0.009

15 Repères historiques L’ancêtre : les coroutines
Entrelacement explicite des exécutions Langages : Simula (67), Modula2 (82) Primitives clés : create + resume Les threads dans les systèmes Cthread (Mach) -> DecThread -> PThread (~90) Chorus, Solaris (87), winNT, IRIX, Linux, etc. Les threads dans les langages Ada (83), Java, etc. C++ //, Eiffel //, etc.

16 Multithreading Premier contact

17 L’interface POSIX-Threads
Interface de programmation standard pour Unix Portabilité des applications Solaris, IRIX, HP-UX, Linux, etc. Fonctionnalités Création/destruction de threads Synchronisation Ordonnancement, priorités Signaux Etc.

18 Exemple: création Création d’un nouveau thread
Éventuels attributs dans la structure attr Exécution de start_func avec le paramètre arg *pid est l’identificateur du thread créé int pthread_create( pthread_t *pid, pthread_attr_t *attr, void * (*start_func)(void *), void *arg);

19 Attente de fin d’exécution
Attente de la terminaison du thread pid Récupération de son code de retour status On peut contourner ce mécanisme en « détachant » les threads : int pthread_join( pthread_t pid, void **status); int pthread_detach( pthread_t pid);

20 « Hello World! » #include <stdio.h> #include <pthread.h>
void *func(void *arg) { printf(“Thread %x says %s\n”, pthread_self(), arg); return NULL; } int main(void) pthread_t pid; pthread_create(&pid, NULL, func, “Hello World!”); printf(“This is the main thread\n”); pthread_join(pid, NULL); return 0;

21 Attributs Ensemble fixé de caractéristiques Threads Verrous
Utilisé à l’initialisation Threads, verrous, variables de condition, etc. Threads Priorité Pile : taille, emplacement Détaché : oui/non Type d’ordonnancement Verrous Inversion de priorités, récursivité

22 Attributs : exemple #include <stdio.h>
#include <pthread.h> void *handle_request(void *arg) { } int main(void) { … pthread_attr_t attr; for(;;) { fd = accept(sock, …); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(NULL, &attr, handle_request, fd);

23 Exemple bis : pile À manipuler avec précaution !
Quelle taille de pile choisir ? Comment prévenir/détecter les débordements ? pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 128*1024); pthread_create(NULL, &attr, func, NULL);

24 Le standard OpenMP Interface pour écrire des applications multithreads portables (sur SMP) Directives de compilation (C, C++, Fortran) + routines Objectif = simplicité + portabilité Constructeurs + fabricants de logiciels + etc. Modèle de programmation « Fork-Join » Parallélisation des boucles (#pragma omp)

25 Partage mémoire efficace
Multithreading Partage mémoire efficace

26 Les threads et la mémoire
Chaque thread possède sa propre pile Variables locales « privées » ( visibilité) Les threads partagent l’espace d’adressage Variables globales Tas (malloc) Variables locales (piles) également ! Intérêt Communications par pointeurs ! Parallélisation de programmes séquentiels aisée ?

27 Problèmes de réentrance
Exemple simple : int glob = 0; void *inc(void *arg) { int i; for(i=0; i<100; i++) glob++; } int main(void) { pthread_create(&t1, NULL, inc, NULL); pthread_create(&t2, NULL, inc, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); printf(“glob = %d\n”, glob); Résultat ?

28 Explication glob++ n’est pas forcément une opération atomique
Scénario d’exécution concurrente par 2 threads : $r1 ; charger Inc r1 ; incrémenter Mov ; enregistrer $r1 Inc r1 $r1 Inc r1 Mov Mov $r1 Inc r1 $r1 Inc r1 Mov Mov

29 Outils pour la synchronisation
Exclusion mutuelle : les verrous Synchronisations plus complexes : Variables de condition (cf moniteurs de Hoare) pthread_cond_wait pthread_cond_signal, pthread_cond_bcast int glob = 0; void *inc(void *arg) { for(i=0; i<100; i++) { pthread_mutex_lock(&mutex); glob++; pthread_mutex_unlock(&mutex); }

30 Code réentrant « code demeurant correct lorsqu’il est exécuté simultanément par plusieurs threads » Exemples typiques Fonction n’utilisant que des variables locales Code protégé par un verrou Quid du code que l’on écrit pas soi-même ? Malloc, free, …, la bibliothéque standard Fonctions « MT-safe » Option –D_REENTRANT Certains prototypes changent…

31 Importance de la synchro.
Cohérence séquentielle de la mémoire ? Compilateurs/Optimiseurs Instructions réordonnées Processeurs modernes Ecritures réordonnées On ne peut pas supposer l’ordre des écritures Primitives de synchronisation Agissent comme des « barrières mémoire »

32 Variables spécifiques
Pb : comment gérer les variables globales « privées » int my_x; void g(void) { …my_x… } void f(void) my_x = do_compute(); g();

33 Variables spécifiques
Principe Variable accessible à partir d’une clé Allocation globale (souvent à l’initialisation) pthread_setspecific(clé, valeur) pthread_getspecific(clé) -> valeur Exemple : la variable errno Fichier errno.h #ifdef _REENTRANT #define errno (*__errno_location()) #else extern int errno; #endif

34 Multithreading Quelques idées reçues ?

35 A propos d’efficacité…
Les threads sont-ils toujours meilleurs que MPI sur architectures SMP ? Approche « processus communicants » Communications pénalisantes (copies) Surcoût en utilisation de ressources Recouvrement plus difficile Approche « processus légers » Synchronisations additionnelles Accès aux variables spécifiques coûteux

36 Exploitation efficace des machines SMP
Quelle catégorie de threads ?

37 Multithreading utilisateur
Deux ordonnanceurs indépendants : User Space Process Scheduler Scheduler OS Kernel processor

38 Multithreading noyau Un seul ordonnanceur : User Space Process
Scheduler OS Kernel processor

39 Multithreading mixte Deux ordonnanceurs coopérants User Space Process
Scheduler Scheduler OS Kernel processor Note: Quid des appels systèmes bloquants ?

40 Performances Athlon 1.4GHz, DDR2100 Alpha 500MHz Opération Unix (fork)
pthread clone Marcel SMP Marcel mono Chgt contexte 600 ns 370 ns 350 ns 180 ns 65 ns Création 80 us 35 us 14 us 1.7 us 0.82 us Alpha 500MHz Opération Unix (fork) pthread clone Marcel SMP Marcel mono Chgt contexte 1.750 us 1.740 us 1.7 us 815 ns 560 ns Création 640 us 190 us 90 us 8 us 4 us

41 E/S et ordonnancement Threads noyaux : OK Threads utilisateurs
Appel bloquant -> blocage du processus entier Threads mixtes Idem au bout d’un certain nombre ! Solutions ? Appels toujours non-bloquants (polling) Appels effectués par des threads dédiés Support système spécifique

42 Exploitation efficace des machines SMP
Scheduler Activations

43 Recouvrement des E/S Au lieu de …on voudrait : Temps CPU perdu
CPU utilisé syscall Espace utilisateur I/O request interrupt Espace noyau Matériel …on voudrait : Espace noyau Espace utilisateur Matériel

44 Scheduler Activations
Introduit par [Anderson et al. 91] Idée: la coopération entre les deux ordonnanceurs est bidirectionnelle L’ordonnanceur utilisateur utilise des appels systèmes L’ordonnanceur noyau utilise des upcalls! Upcalls Informe l’application des événements noyaux Activations Autant d’activations en exécution que de processeurs Contrôlées par le noyau Principe mis en œuvre dans Solaris

45 Illustration du principe
Process User scheduler

46 Illustration du principe
Process new

47 Illustration du principe
Process new

48 Illustration du principe
Déroulement d’un appel bloquant… Process Appel système bloquant

49 Illustration du principe
Déroulement d’un appel bloquant… Process New + blocked

50 Illustration du principe
Déroulement d’un appel bloquant… Process Appel terminé

51 Illustration du principe
Déroulement d’un appel bloquant… Process Unblocked

52 Illustration du principe
Déroulement d’un appel bloquant… Process

53 Difficultés de mise en œuvre
Retour d’un appel bloquant Un « unblock upcall » nécessite deux appels systèmes supplémentaires… La généricité coûte cher !! Perte du processeur Signalée par un upcall particulier Objectif = éviter les attentes actives ! Conséquences L’ordonnanceur de niveau utilisateur doit se prémunir contre ces interruptions intempestives Le coût est prohibitif !

54 Coût de la préemption Lorsqu’une activation est préemptée… Problèmes
L’ordonnanceur doit être averti Pourquoi ? Un thread peut détenir un « spin-lock » ! Comment ? En déclenchant un upcall preempt Problèmes Une préemption peut survenir n’importe quand Changements de contexte asynchrones Nécessité de protéger beaucoup de code e.g. la fonction thread_yield() ...

55 Coût des appels bloquants
thread sp blocking syscall sp registers activation

56 Coût des appels bloquants
thread sp thread activation sp Clock int. sp registers registers sp sp blocked activation

57 Coût des appels bloquants
thread sp thread activation sp registers sp registers registers sp activation

58 Coût des appels bloquants
thread sp thread activation sp registers registers registers sp

59 Coût des appels bloquants
thread sp thread activation jb sp registers registers sys_restart

60 Coût des appels bloquants
thread sp thread activation registers

61 Un modèle revisité Contexte = calcul haute performance Propositions
Une application // à la fois sur la grappe Optimisations pour ce cas de figure Les activations perdent rarement le processeur Propositions Suppression des évènements « preempt » Utilisation d’une pile par processeur Implantation Linux 2.2.x Bibliothèque de threads Marcel

62 A propos de réactivité…
Problèmes liés aux évènements « unblock » Coût important, réactivité non-garantie Proposition Pour les notifications non-urgentes Positionnement d’une variable partagée Test à chaque changement de contexte Pour les notifications critiques Lors du retour en mode utilisateur : Déviation vers le thread « client » de l’événement Déviation éventuellement différée…

63 Modifications du noyau Linux
Parties du noyau modifiées schedule(), do_fork() and do_exit() Implantation des transitions task_struct structure Nouveaux champs (état des activations, etc.) Code ajouté Appels systèmes + API pour les upcalls Gestion des upcalls (~signaux) Code pour les changements d’état des activations

64 Performance (PC)

65 Multithreading Distribué
Principe et Enjeux

66 Principe Introduire les threads dans les applications distribuées
proc proc proc proc réseau

67 Enjeux Bénéfices escomptés
Meilleur support du parallélisme à grain fin Recouvrement naturel des communications Uniformisation de la configuration Machines monoprocesseur/machines SMP

68 Intérêts Apports des threads Virtualisation de l’architecture
Threads = processeurs virtuels Passage à l’échelle (scalability) Bonne cible pour des compilateurs Meilleure réactivité au réseau Traitement asynchrone des messages Équilibrage de charge par migration de threads Équilibrage dynamique Régulateur indépendant de l’application (plug-ins) !

69 Multithreading Distribué
Quel modèle de programmation ?

70 Approche par juxtaposition
Principe : pas de modèle ! Simplement utiliser conjointement Une bibliothèque de communication (ex: MPI) Une bibliothèque de multithreading Problèmes Conceptuels Pas de visibilité globale des threads Sémantique des communications ? Techniques Compatibilité entre les bibliothèques Travail d’intégration spécifique -> non réutilisable

71 Approche intégrée Threads communicants Pthreads + extensions Pthreads
A0, Chant Pthreads + extensions Rthreads Pthreads DSM-threads Appels de procédure à distance « threadés » A0, Nexus, PM2

72 Threads communicants Principe Exemples Envoi de message entre threads
Modèle « MPI-like » Modèle « Acteurs » Nommage Nommage global des threads Ports de communication Exemples Chant (M. Haines, ICASE) Athapascan-0b (J. Briat, INRIA Grenoble)

73 Modèle Pthreads étendu
Principe Threads + primitives étendues Create/Join à distance Synchronisations distribuées Particularités Nommage global des threads Restriction du modèle Pthreads Exemples Chant (M.Haines, ICASE), Rthreads (M. Zahn, Allemagne)

74 Modèle Pthreads distribué
Principe Adaptation complète (?) de Pthreads Threads + mémoire virtuellement partagée Transparence Cohérence assurée lors des défauts de pages Restriction sur les E/S Extensions Cohérences mémoires relâchées Exemple DSM-Threads (F. Mueller, Berlin)

75 Modèle dérivé des RPC Principe Exemples
Appel de procédure à distance (A. Birell) Extension du concept aux threads Création de threads pour exécuter les procédures Désignation globale des services Numéro  fonction Souches (stubs) pour la transmission des paramètres Exemples Nexus (I. Foster, Argonne), PM2

76 Multithreading Distribué
L’environnement PM2

77 Projet PM2 (95-xx) Objectif ambitieux : virtualisation Propositions
Indépendance de la machine cible (#processeurs) Degré de parallélisme important (#processus) Parler de “traitement” / “processus” mécanismes de décomposition parallèle Propositions Mécanisme de décomposition Appel de procédure à distance léger (LRPC) Support des activités Processus légers (threads) Régulateur dynamique de charge Placement + Migration

78 Appel de procédure à distance
PM2 PM2 LRPC Différentes déclinaisons Synchrone Attente différée Asynchrone Nos concurrents... Nexus : RSR Athapascan : appels de service

79 Mobilité des activités
Migration de processus légers PM2 PM2 Pourquoi ? Régulation de charge Localité des données Comment ? Transfert du contexte Programmes SPMD

80 Multithreading Distribué
Communications dans un environnement multithreads

81 Communications performantes
Comment exploiter les réseaux rapides ? Faible latence Quelques microsecondes Bande passante élevée De l’ordre du Gb/s Tendance actuelle Interaction directe avec la carte réseau Communication en « mode utilisateur » Transmissions zéro-copie La carte récupère/dépose les données au bon endroit

82 Ethernet Cartes passives (sauf Giga-Ethernet)
Interfaces : TCP, SBP, GAMMA, VIA, … Memory TX-ring DMA TX reg RX reg PCI Bus Network PCI Bridge Packet Interface NIC

83 Myrinet Produit Myricom (C. Seitz) Carte programmable
Réseau commuté, routage wormhole Carte programmable Protocoles de transmission « intelligents » Stratégie adaptée à la taille des messages Déclenchement d’interruptions DMA SRAM PCI Bus Packet Interface Network PCI Bridge RISC LANai NIC

84 Interface efficace pour Myrinet
BIP : Basic Interface for Parallelism Loic Prylli (ReMaP) en 1997 Performances Latence  5 s, bande passante > 125 Mo/s Fonctionnalités réduites au minimum Messages courts : recopiés à l’arrivée Messages longs : mode zéro-copie (RDV) Contrôle de flux minimal Matériel (msgs “évaporés” au dela de 50ms)

85 SCI : Scalable Coherent Interface
Réseau à “capacité d’adressage” Normalisé par IEEE en 1993 Principal constructeur : Dolphin ICS Principe Accés mémoire distants Implicites (après projection) Explicites (remote DMA) Support matériel pour une MVP (?) Performances Ecriture  2 s, lecture  4 s Bande passante  85 Mo/s (difficilement !)

86 Adressage à distance Projections effectués par le pilote (SISCI)
Zones de mémoire physiques souvent spécifiques Accès mémoire effectués par le processeur Le processeur distant n’est pas (forcément) interrompu

87 Ce qu’il faut retenir Interfaces de très bas niveau !
Fonctionnalités proches du matériel Grande efficacité Paradigmes très différents Approche non généralisable Pas de consensus Tentative de standard : VIA Virtual Interface Architecture (Intel, Microsoft, Compaq) But : dénominateur commun Bas niveau, peu adapté à certaines technologies Portabilité ???

88 Contexte et motivations
Concilier efficacité et portabilité

89 Il y a MPI… Implantations efficaces existantes
MPICH/BIP, MPICH/SISCI, etc. Quid des schémas de communication de la vraie vie ? Messages dont le contenu est inconnu a priori par le récepteur Transmissions zéro-copie ? Messages asynchrones Recouvrement des communications ? Accès mémoire distants (PUT/GET) Temps de réponse ?

90 Transmissions zéro-copie
Processus A Réseau Processus B Message Entête Données Préparation mémoire Acquittement DMA

91 Et la réactivité alors ? Problèmes
Assurer la progression des communications asynchrones Réagir rapidement aux sollicitations extérieures proc proc proc proc réseau

92 Envois asynchrones Parvient-on vraiment à assurer du recouvrement ?
MPI_Isend MPI_recv Acquittement MPI_test Processus A Processus B

93 L’interface Madeleine
Principe

94 Madeleine Interface de communication Double objectif Proposition
Efficace et portable Double objectif Support de multiples paradigmes/modes Support de multiples réseaux simultanément Proposition Programmation par « contrat » Contrôle du niveau d’optimisation Transferts immédiats possibles Statut Disponible sur BIP, SISCI, TCP et MPI. Portage en cours sur VIA

95 Interface Construction des messages
Gestion des canaux (~ communicators) Choix explicite du dispositif physique mad_begin_packing mad_pack mad_end_packing mad_begin_unpacking mad_unpack mad_end_unpacking

96 Packing et Unpacking Commandes : Modes :
mad_pack (cnx, buffer, len, pack_mode, unpack_mode) mad_unpack (cnx, buffer, len, pack_mode, unpack_mode) Modes : Send_SAFER Send_CHEAPER Send_LATER Receive_EXPRESS Receive_CHEAPER

97 RPC efficaces avec Madeleine
LRPC, Migration Madeleine Gestion générique de tampons Gestion des transmissions BIP, SISCI, VIA, TCP, MPI

98 Emission : modes d’empaquetage
Send_SAFER Send_LATER Send_CHEAPER Pack Modification End_packing ? Version transmise

99 Réception : mode de déballage (1)
RECV_EXPRESS Unpack Tampon Après Unpack Données disponibles End_packing

100 Réception : mode de déballage (2)
RECV_CHEAPER Unpack Tampon Après Unpack Données disponibles ??? End_packing Données disponibles

101 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

102 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

103 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

104 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

105 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

106 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

107 Exemple Sending side Receiving side int n; int n;
char *s = "Hello, World !"; char *s = NULL; p_mad_connection_t cnx; p_mad_connection_t cnx; cnx = mad_begin_packing(channel, dest); cnx = mad_begin_unpacking(channel); n = strlen(s) + 1; mad_pack(cnx, &n, sizeof(int), mad_unpack(cnx, &n, sizeof(int), send_CHEAPER, receive_EXPRESS); send_CHEAPER,receive_EXPRESS); s = malloc(n); mad_pack(cnx, s, n, mad_unpack(cnx, s, n, send_CHEAPER, receive_CHEAPER); send_CHEAPER,receive_CHEAPER); mad_end_packing(cnx); mad_end_unpacking(cnx);

108 Generic Buffer Management Modules
Madeleine – structure Application Application Generic Buffer Management Modules Switch Switch BMM1 BMMn BMM1 BMMm Specific Transmission Modules Selection Selection TM1 TMn TM1 TMn Network

109 ? Adaptativité Sélection du mode de transmission adéquat Interface
Pack Gestion des tampons ? Gestion de protocole

110 Implementation Madeleine II a été portée sur : SISCI/SCI BIP/Myrinet
MPI VIA TCP SBP

111 BIP/Myrinet

112 BIP/Myrinet

113 SISCI/SCI

114 SISCI/SCI

115 Quelques résultats Latence Bande passante Migration (PM2)
7 µs sur BIP/Myrinet 4 µs sur SISCI/SCI Bande passante 125 Mo/s sur BIP/Myrinet 80 Mo/s sur SISCI/SCI Migration (PM2) 24 µs sur SISCI/SCI 52 µs sur BIP/Myrinet

116 MPICH/Madeleine II MPICH: general-purpose portable MPI implementation
well-defined protocol interface Abstract Device Madeleine: cluster-specific high-performance communication generic structure available on Gigabit networks highly optimized implementation The best of both worlds! Madeleine as a MPICH device

117 multi-protocol management
MPICH/Madeleine II MPI API Generic part (collective operations, context/group management, ...) ADI Generic ADI code, datatype management, request queues management Protocol Interface CH_MAD device inter-node communication polling loops eager protocol rendez-vous-protocol SMP_PLUG device intra-node communication CH_SELF device self communication Madeleine II multi-protocol management TCP SISCI BIP Fast-Ethernet SCI Myrinet

118 Latency

119 Bandwidth

120 Multithreading Distribué
Vers des communications sur grappes de grappes…

121 Objectifs Support des grappes de grappes Réseau rapide
Communications hétérogènes Transparence Efficacité du routage sur les machines « passerelles » Minimisation des copies Maintien du débit par techniques de pipeline Utilisation des threads ! Réseau rapide PC/SCI PC/Myrinet

122 PACX-MPI 2 nœuds sacrifiés pour les communications
Transparence pour l’application Protocole TCP/IP entre les grappes MPI MPI TCP

123 Globus Principe : Appel de Procédure à Distance
Librairie de communication : Nexus Multiprotocole Multithreading non nécessairement préemptif La passerelle est sacrifiée Tout est à faire par l’utilisateur Pas de gestion explicite des grappes de grappes Pas adapté au problème

124 Madeleine II Bibliothèque de communication Multiprotocole
Canaux de communication indépendants Un canal correspond à un adaptateur réseau Canal SCI Canal TCP Canal TCP

125 Structure interne Couche générique de gestion de tampons
Couche de portabilité avec les protocoles Application MGT1 MGTn MGT2 MT1 MTn MT2 Réseau

126 Structure interne Application Application Couche de gestion de tampons
Aiguillage Aiguillage MGT1 MGTn MGT1 MGTn Sélection Sélection Couche de portabilité MT1 MTn MT1 MTn Réseau Réseau

127 Structure (suite) Organisation des données
Madeleine : données globales Driver : spécifique à un protocole Adapter : virtualisation d’une carte réseau Channel : isolation des communications Connection : connexion point à point Link : virtualisation d’une méthode de transfert

128 Ce qui manque Utilisation de réseaux qui ne sont pas présents sur tous les nœuds Envoi de messages entre des machines non directement reliées SCI Myrinet

129 Intégration dans Madeleine
MTs : pas portable MGTs : problèmes de conversion Au-dessus : perte d’efficacité Application MGT1 MGT2 MGTn MT1 MT2 Réseau

130 Solution retenue MT générique entre les MTs et les MGTs
Pas de MGT au niveau de la passerelle Application MGT1 MGT2 MGTn MT générique MT1 MT2 Réseau

131 Canaux virtuels Contiennent plusieurs canaux réels
Permettent de séparer les messages à retransmettre des messages normaux (canaux réels différents) Canal virtuel Canaux SCI Canaux Myrinet 1 2 3 4 Canal spécial Canal normal

132 Réactivité et parallélisme
Retransmission des messages par des threads dédiés Une paire de threads par réseau physique Mécanisme de pipeline Réception des messages normaux sur la passerelle Pas d’informations à priori sur la provenance Threads de scrutation

133 Principe de la passerelle
Application Thread de scrutation Threads de retransmission Myrinet SCI

134 Tests de performances Ping-pong entre 2 machines séparées par une passerelle 1 2 3 SCI Myrinet

135 Évaluation

136 Multithreading Distribué
Intégration des threads et des communications

137 Progression des communications
Problème Comment assurer la progression des communications ? proc proc proc proc réseau

138 Scrutation et interruptions
La scrutation est nécessaire API réseau ne fournissant pas d’appels bloquants OS ne fournissant pas “d’activations” Problème Fréquence difficile à assurer Coûteux en présence de multiple “pollers ” Les interruptions sont nécessaires Réactivité Outils de synchronisation “interrupt safe” ?

139 Support de l’ordonnanceur
Ordonnanceur = serveur de scrutation Choix de la méthode d’accès (scrutation/intr.) Support pour la scrutation Fréquence contrôlée Factorisation des scrutations multiples Support pour les interruptions Utilisation possible des activations Verrous spécifiques « interrupt-safe »

140 Scrutation par l’ordonnanceur
 Création d’une catégorie de polling (ex: MPI), assignation d’une fréquence et enregistrement de callbacks. Polling jobs queue  Chaque thread candidat à une opération de polling adresse une requête à l’ordonnanceur et se bloque. MPI_Isend Marcel_poll MPI_Irecv Marcel_poll MPI Polling( ) callback callback  Régulièrement, l’ordonnanceur appelle la fonction de scrutation définie par l’utilisateur... Ordonnanceur des threads

141 Multithreading Distribué
L’environnement PM2

142 PM2 : architecture logicielle
Applications Régulation HPF, C* C++//, Java Interface de programmation (RPC, migration, allocation iso-adresse) Marcel PM Madeleine Unix (~10 versions) Architecture (grappes, machines parallèles) Légende Marcel : noyau de processus légers Madeleine : module de communication

143 Structure de PM2 Structure PM2 PM2 Intrinsics MICRO-PM2 MARCEL
API : MICRO PM2 + PM2 Intrinsics PM2 API : LRPC avec stubs, migration iso-adresse, DSM PM2 Intrinsics Console Migration DSM-PM2 LRPC “ancien style” API : non-threaded RPC (“packs” Madeleine), thread create, API Marcel MICRO-PM2 MARCEL MADELEINE Iso-addr

144 Multithreading Distribué
Conclusion

145 Conclusion Multithreading Multithreading distribué
Exploitation efficace des architectures SMP Contrôle fin de l’ordonnancement Conditionné par les fonctionnalités du système Multithreading distribué Communications de type RPC Support spécifique nécessaire Intégration des threads et des communications Délicate !! Mieux maîtrisée si fonctionnement coopératif


Télécharger ppt "Supports d’exécution pour grappes de machines SMP"

Présentations similaires


Annonces Google