Multithreading et Calcul Haute Performance

109
Multithreading et Calcul Haute Performance J-F. Méhaut, R. Namyst INRIA, ReMaP, LIP, ENS Lyon

description

Multithreading et Calcul Haute Performance. J-F. Méhaut , R. Namyst INRIA, ReMaP, LIP, ENS Lyon. Au menu. Introduction : contexte technologique Nouvelles archis: processeurs, réseaux, etc. Multithreading : quels intérêts? Définition, premiers contacts, partage mémoire Pause (10’) - PowerPoint PPT Presentation

Transcript of Multithreading et Calcul Haute Performance

Page 1: Multithreading et Calcul Haute Performance

Multithreading et Calcul Haute Performance

J-F. Méhaut, R. NamystINRIA, ReMaP, LIP, ENS Lyon

Page 2: Multithreading et Calcul Haute Performance

Au menu

Introduction : contexte technologique Nouvelles archis: processeurs, réseaux, etc.

Multithreading : quels intérêts? Définition, premiers contacts, partage

mémoire Pause (10’) Multithreading distribué

Intérêts et difficultés Quelques environnements L’environnement PM2

Conclusion

Page 3: Multithreading et Calcul Haute Performance

Introduction

Page 4: Multithreading et Calcul Haute Performance

Architecture processeur Cray-TERA

3 41 2Applications

Threads concurrents

Streams

i=1 i=2

i=3 i=n…

j=1

j=2

j=3 j=m

G(A)F (a)

F (b)Programme

séquentiel

Pool d’instructions prêtes

Pipeline d’instructions en cours d’exécution

Page 5: Multithreading et Calcul Haute Performance

Multi-threading Cray-TERA

Principe Maintenir plusieurs threads (streams) actifs

(40 à 80 streams => 90% utilisation de la machine)

Garantir une instruction prête à chaque cycle processeur

Dispositif matériel supportant Gestion de plusieurs streams Changement de contexte tous les cycles (3ns) Jusqu’à 8 requêtes d’accès mémoire en attente

pour un stream

Page 6: Multithreading et Calcul Haute Performance

Caractéristiques du processeur Cray-TERA

Horloge 333 MHZ

Accès mémoire 2,8 Gbytes/seconde bande passante Emission/réception d’un paquet par cycle Pas de cache de données, cache instr 2Mbytes

Multiprogrammation/concurrence 16 domaines de protection 128 streams (32 registres, 1 Program Counter)

Page 7: Multithreading et Calcul Haute Performance

Enjeux

Trouver le bon niveau de parallélisme Besoin de travail (threads) pour saturer

la machine Quatre sources potentielles de

parallélisme Applications (jobs) Threads Boucles ILP (Instruction-Level Parallelism)

Compilateur/paralléliseur Marché restreint

Une machine installée à San Diego

Page 8: Multithreading et Calcul Haute Performance

Cluster computing

Architecture homogène, faiblement hétérogène Grappes (Cluster, COW), machines //

PC, stations de travail SCI, Myrinet, Giganet, MPC, ...

Protocoles de communication BIP, SISCI, SciOS, VIA, TCP, UDP, ...

Myrinet/BIP

PC

Commutateur

Page 9: Multithreading et Calcul Haute Performance

Motivations pour le haut-débit

Performances des communicationsAtteindre le niveau de performance des machines

parallèlesavec les équipements du marché (PC ou station de

travail)

Minimiser la latence, maximiser le débit

Thématiques de recherche Matériel

Commutateurs, cartes d’interface Commutations, routage

Logiciel Interfaces de communication (AM, FM, BIP, …) Env. de programmation (MPI, PM2, Nexus,…)

Page 10: Multithreading et Calcul Haute Performance

Myrinet

Objectifs Performances en communication

équivalentes à celles des supercomputers Quelques microsecondes en latence Atteindre le Gbps en bande passante

Caractéristiques Carte d’interface programmable Protocole : carte d’interface et le host Utilisé pour implémenter des

environnements de programmation

Page 11: Multithreading et Calcul Haute Performance

Myrinet : Description technique

Myrinet commutateur

HostCarte d’interface

HostCarte d’interface

Myrinet commutateur

HostCarte d’interface

HostCarte d’interface

Host

Carte d’interface

Host

Carte d’interface

Câble 2,6 Gbps full duplex

Crossbar complet

Routage Statique à la source (entête consommé

progressivement) Wormhole

Page 12: Multithreading et Calcul Haute Performance

Myrinet : cartes d’interface

Matériel 66MHz cpu (LANai) 1 Mbyte SRAM 3 DMA (lien entrée, lien sortie, mémoire du

host) Interface au bus PCI

Logiciel LANai Control Program (LCP)

Lien MyrinetRISC

Packet

Interface

DMA

Controler

DMA

Controler

PCI

Bridge

PCI

Bridge

PCI Bus

LANai

MemoryMemory

Performance (BIP/Myrinet) 6 microsecondes latence 127 Mbytes/sec bande passante

Page 13: Multithreading et Calcul Haute Performance

SCI*(Scalable Coherent Interface)

Interconnexion SCI

Processus A

Espace d'adressage

virtuel

Bus PCI

PCI-SCI

Processus B

Espace d'adressage

virtuel

Bus PCI

PCI-SCI

Mémoire physique

Réseau à capacité d’adressage Adressage des mémoires distantes Lecture/écriture distante sans interruption du processeur

distant Support matériel pour mémoire partagée

* Emmanuel Cecchet (Sirac, INRIA Rhône-Alpes)

Page 14: Multithreading et Calcul Haute Performance

SCI : caractéristiques techniques

Scalable Coherent Interface Matériel standard (PC, station Unix, …) Architecture en anneau et/ou commutateur Evolutif jusqu’à 64 Knœuds Bande passante de 500 Mo/s (4 Gb/s) full-duplex

Pas de cohérence sur PCI (bus d’entrées/sorties)

Latence Cache L1

Cache L2

Mémoire SCI

Lecture 5 ns 60 ns 120 ns 4 µs

Ecriture 5 ns 60 ns 120 ns 2 µs

* Emmanuel Cecchet (Sirac, INRIA Rhône-Alpes)

Page 15: Multithreading et Calcul Haute Performance

SCI : performances

Latence : 2.5 s (écriture de processus à processus) Débit :70 Mo/s Verrou : < 10 s (fetch&add)

Page 16: Multithreading et Calcul Haute Performance

Comms : remarques préliminaires

Règle des 80/80 80% des messages sont de taille inférieure à 256

octets 80% du trafic provient de messages d’une taille

supérieure à 8KB

Nouvelles approches Latence faible pour les petits messages Bande passante importante pour les gros messages Coût des protocoles traditionnels

Page 17: Multithreading et Calcul Haute Performance

Communications système

Evolutions technologiques Coûts logiciels des protocoles

Protocole système (TCP/UDP/IP)

Réseaux 10 Mb

Réseaux 100 MbRéseaux Gb

Page 18: Multithreading et Calcul Haute Performance

Comm. en contexte utilisateur

Processus

Interface

OS

Recherches académiques Active Messages (Berkeley) Illinois Fast Messages (Urbana) U-Net (Cornell) MPC (Paris6, Versailles) BIP (Lyon)

Interface de bas-niveau Cibles pour les supports d’exécution

Standard industriel : VIA Participation des industriels Etendre le spectre des applications

Page 19: Multithreading et Calcul Haute Performance

VIA : Virtual Interface Architecture

VI Consumer

VI User Agent (“libvia”)

Ope

n, C

onne

ct,

Map

Mem

ory

Descriptor Read, Write

VI-Capable NIC

Sockets, MPI,Legacy, etc.

RequestsCompleted

VI VI C

S S S COMP

R R R

VI

Do

orb

ells

Und

eter

min

ed

VI Kernel Agent (Slow) User-Level (Fast)

Host

NIC

Page 20: Multithreading et Calcul Haute Performance

Giganet : Cartes VIAGiganet : Cartes VIA

TCP/IPTCP/IP

Winsock APIWinsock APIWinsock APIWinsock API

FastFast

NDISNDIS

VI APIVI API

FastestFastest

ApplicationApplicationApplicationApplication

Native VI InterfaceNative VI Interface

With VIA50 versus 7000

instructions

Page 21: Multithreading et Calcul Haute Performance

• Commutateurs• Cartes d’interface• Administration du réseau• cLAN pour Windows• cLAN pour Linux

Page 22: Multithreading et Calcul Haute Performance

Supports d’exécution parallèle

Avantages pour les utilisateurs Abstractions de haut niveau Portabilité des applications Efficacité !

Support d’exécution //

Architectures parallèles et distribuées

Systèmes d’exploitation

Interface de programmation (API)

Applications

Page 23: Multithreading et Calcul Haute Performance

Le multithreading :quel(s) intérêt(s) ?

Introduction et rappels

Page 24: Multithreading et Calcul Haute Performance

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

Page 25: Multithreading et Calcul Haute Performance

Processus lourds (bis)

Ressources “kernel” + données “user”

processeur processeur processeur

Noyau

Processus

Ordonnanceur

Espace utilisateur

Processus Processus

Page 26: Multithreading et Calcul Haute Performance

Threads : Motivations

Difficulté de programmation Fil d’exécution unique

une seule chose à la fois !

Partage de données laborieux

Performances Opérations de base coûteuses Recouvrement des opérations d’E/S

difficiles

Page 27: Multithreading et Calcul Haute Performance

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)

Page 28: Multithreading et Calcul Haute Performance

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();

}

Page 29: Multithreading et Calcul Haute Performance

Systèmes multiprogrammés

Exécution indépendante des activités Concurrence entre les différents

traitements

for (;;) {

wait for network msg;

getNetworkMsg();

}

for (;;) {

wait for key stroke;

getKey();

}

for (;;) {

wait for disk block;

handleDiskBlock();

}

Page 30: Multithreading et Calcul Haute Performance

Processus serveur classique

Sérialisation des requêtes

Pas de recouvrement des E/S Exploitation SMP délicate Prise en compte de priorités ?

OS OS

client serveur

Page 31: Multithreading et Calcul Haute Performance

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%)

Page 32: Multithreading et Calcul Haute Performance

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

Page 33: Multithreading et Calcul Haute Performance

Caractéristiques de base

Thread = pile + contexte Partage de ressources

Code, tas, … : espace d’adressage Fichiers ouverts Table des traitants de signaux

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

Page 34: Multithreading et Calcul Haute Performance

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

Page 35: Multithreading et Calcul Haute Performance

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.

Page 36: Multithreading et Calcul Haute Performance

Le multithreading :quel(s) intérêt(s) ?

Premier contact

Page 37: Multithreading et Calcul Haute Performance

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.

Page 38: Multithreading et Calcul Haute Performance

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);

Page 39: Multithreading et Calcul Haute Performance

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);

Page 40: Multithreading et Calcul Haute Performance

« 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;

}

Page 41: Multithreading et Calcul Haute Performance

Attributs

Ensemble fixé de caractéristiques 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é

Page 42: Multithreading et Calcul Haute Performance

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);

}}

Page 43: Multithreading et Calcul Haute Performance

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);

Page 44: Multithreading et Calcul Haute Performance

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)

Page 45: Multithreading et Calcul Haute Performance

Le multithreading :quel(s) intérêt(s) ?

Partage mémoire efficace

Page 46: Multithreading et Calcul Haute Performance

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 ?

Page 47: Multithreading et Calcul Haute Performance

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 ?

Page 48: Multithreading et Calcul Haute Performance

Explication

glob++ n’est pas forcément une opération atomique

Scénario d’exécution concurrente par 2 threads :

Mov @glob, $r1 ; chargerInc r1 ; incrémenterMov $r1, @glob ; enregistrer

Mov @glob, $r1Inc r1

Mov @glob, $r1Inc r1Mov $r1, @glob…

Mov $r1, @glob

Mov @glob, $r1Inc r1

Mov @glob, $r1Inc r1Mov $r1, @glob…

Mov $r1, @glob

Page 49: Multithreading et Calcul Haute Performance

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);

}}

Page 50: Multithreading et Calcul Haute Performance

Code réentrant

« code demeurant correct lorsqu’il estexé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…

Page 51: Multithreading et Calcul Haute Performance

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 »

Page 52: Multithreading et Calcul Haute Performance

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();

}

Page 53: Multithreading et Calcul Haute Performance

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())

#elseextern int errno;

#endif

Page 54: Multithreading et Calcul Haute Performance

A propos d’efficacité

Les threads sont-ils toujours meilleurs que MPI sur architectures SMP ?

Solution « processus communicants » Communications pénalisantes (copies) Surcoût en utilisation de ressources Recouvrement plus difficile

Solution « processus légers » Synchronisations additionnelles Accès aux variables spécifiques coûteux

Page 55: Multithreading et Calcul Haute Performance

Le multithreading :quel(s) intérêt(s) ?

Ordonnancement des threads

Page 56: Multithreading et Calcul Haute Performance

Multithreading utilisateur

Deux ordonnanceurs indépendants :

processor processor processor

OS Kernel

Process Process Process

Scheduler

User Space

Scheduler Scheduler

Page 57: Multithreading et Calcul Haute Performance

Multithreading noyau

Un seul ordonnanceur :

processor processor processor

OS Kernel

Process Process Process

Scheduler

User Space

Page 58: Multithreading et Calcul Haute Performance

Multithreading mixte

Deux ordonnanceurs coopérants

processor processor processor

OS Kernel

Process Process Process

Scheduler

User Space

Scheduler Scheduler

Note: Quid des appels systèmes bloquants ?

Page 59: Multithreading et Calcul Haute Performance

Ordonnancement non-préemptif

Le processus cède la main Lorsqu’il se bloque Lorsqu’il meurt

Avantages Peu de commutations de contextes Atténuation des problèmes de

réentrance Inconvénients

Partage non-équitable des ressources Risque de famines

Page 60: Multithreading et Calcul Haute Performance

Ordonnancement préemptif

Une horloge force les commutations Avantages

cf. inconvénients du non-préemptif Inconvénients

cf. avantages du non-préemptif En général

Threads noyaux préemptif Threads utilisateurs non-préemptif

Page 61: Multithreading et Calcul Haute Performance

Choix de l’ordonnancement

Niveau d’ordonnancement pthread_attr_setscope(…)

PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_PROCESS

Classes d’ordonnancement pthread_attr_setschedpolicy(…)

SCHED_FIFO SCHED_RR SCHED_OTHER

Page 62: Multithreading et Calcul Haute Performance

Le multithreading :quel(s) intérêt(s) ?

Recouvrement des Entrées/Sorties

Page 63: Multithreading et Calcul Haute Performance

Recouvrement des E/S

Au lieu de

Espace noyau

Espace utilisateur

Matériel

syscall

…on voudrait :

Espace noyau

Espace utilisateur

Matériel

I/O request interrupt

Temps CPU perdu

CPU utilisé

Page 64: Multithreading et Calcul Haute Performance

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

Page 65: Multithreading et Calcul Haute Performance

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

Page 66: Multithreading et Calcul Haute Performance

MultithreadingDistribué

Principe et Enjeux

Page 67: Multithreading et Calcul Haute Performance

Principe

Introduire les threads dans les applications distribuées

procproc proc proc

réseau

Page 68: Multithreading et Calcul Haute Performance

Enjeux

« Bénéfices » escomptés Recouvrement naturel des communications Meilleur support du parallélisme à grain fin Uniformisation de la configuration

machines monoprocesseur/machines SMP Virtualisation de l’architecture

threads = processeurs virtuels cible pour des compilateurs (ex: HPF) équilibrage de charge générique et transparent

Meilleure réactivité au réseau Exécution distribuée de langages

multithreads

Page 69: Multithreading et Calcul Haute Performance

Virtualisation

Objectif Machine constituée de centaines de

processeurs virtuels Intérêts

Applications s’adaptant à la configuration Passage à l’échelle (scalability) Équilibrage de charge possible par

migration de threads Équilibrage dynamique Régulateur indépendant de l’application !

Page 70: Multithreading et Calcul Haute Performance

Virtualisation : contraintes

Exécution indépendante à la localisation Problème des E/S délicat

Communications par mémoire partagée Mémoire virtuellement partagée nécessaire

Compatible avec les threads ! Difficile sur architecture hétérogène

Architecture hétérogène Migration des threads prohibitive

Page 71: Multithreading et Calcul Haute Performance

Meilleure réactivité au réseau

Illustration : MPI et les communications asynchrones

Processus A Processus B

Acquittement

MPI_Isend

MPI_recv

MPI_test

Page 72: Multithreading et Calcul Haute Performance

MultithreadingDistribué

Quel modèle de programmation ?

Page 73: Multithreading et Calcul Haute Performance

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

Page 74: Multithreading et Calcul Haute Performance

Threads communicants

Principe 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)

Page 75: Multithreading et Calcul Haute Performance

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)

Page 76: Multithreading et Calcul Haute Performance

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)

Page 77: Multithreading et Calcul Haute Performance

Modèle dérivé des RPC

Principe 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

Page 78: Multithreading et Calcul Haute Performance

MultithreadingDistribué

Intégration des threadset des communications

Page 79: Multithreading et Calcul Haute Performance

Progression des communications

Problème Comment assurer la progression des

communications ?

procproc proc proc

réseau

Page 80: Multithreading et Calcul Haute Performance

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é

Problème Outils de synchronisation “interrupt safe” ?

Page 81: Multithreading et Calcul Haute Performance

Scrutation par l’ordonnanceur

Ordonnanceurdes threads

Création d’une catégoriede polling (ex: MPI), assignation d’une fréquence et enregistrement de callbacks.

Polling jobsqueue

MPI

MPI_IsendMarcel_poll

Chaque thread candidat à une opération de polling adresse une requête à l’ordonnanceur et se bloque.

MPI_IrecvMarcel_poll

callbackcallback

Régulièrement, l’ordonnanceur appelle la fonction de scrutation définie par l’utilisateur...

Polling( )

Page 82: Multithreading et Calcul Haute Performance

MultithreadingDistribué

L’environnement PM2

Page 83: Multithreading et Calcul Haute Performance

Premières réflexions sur PM2

Parallel Multithreaded Machine (R. Namyst) Virtualisation de l’architecture Régulateurs génériques de charge (Y. Denneulin) Plateformes usuelles (COW, NOW), machines

parallèles Distribution du logiciel, assistance, documentation:-(

InterPRC Stratagème (C. Roucairol) Applications irrégulières

Optimisation combinatoire Algèbre linéaire creuse (J. Roman)

Ordonnancement, régulation Fortement irrégulière : placement + migration

Page 84: Multithreading et Calcul Haute Performance

Projet PM2 (95-xx)

Objectif ambitieux : virtualisation 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

Page 85: Multithreading et Calcul Haute Performance

Appel de procédure à distance

Différentes déclinaisons Synchrone Attente différée Asynchrone

PM2 PM2

LRPC

Nos concurrents... Nexus : RSR Athapascan : appels de service

Page 86: Multithreading et Calcul Haute Performance

Hello World!#include <pm2.h>unsigned SAMPLE;void sample_func(void){ char msg[128];

pm2_unpack_byte(SEND_CHEAPER, RECV_CHEAPER, msg, 128);pm2_rawrpc_waitdata();printf(“%s\n”, msg);

}void main(int argc, char **argv){ int module[MAX_MODULES], nb_modules;

pm2_rawrpc_register(&SAMPLE, sample_func);pm2_init(&argc, argv, 2, module, &nb_modules);if(pm2_self() == les_modules[0]) {

pm2_rawrpc_begin(module[1], SAMPLE, NULL);pm2_pack_byte(SEND_CHEAPER, RECV_CHEAPER, “Hello World!”,

128);pm2_rawrpc_end();pm2_kill_modules(module, nb_modules);

}pm2_exit();

}

Page 87: Multithreading et Calcul Haute Performance

Threaded “Hello world!”

Création d’un thread Obligatoirement par pm2_thread_create

positionnement d’un certain nombre d’attributs héritage du “droit” de faire unpack

...void thread_func(void *arg){ char msg[128];

pm2_unpack_byte(SEND_CHEAPER, RECV_CHEAPER, msg, 128);pm2_rawrpc_waitdata();printf(“%s\n”, msg);

}

void sample_func(void){

pm2_thread_create(thread_func, NULL);}...

Page 88: Multithreading et Calcul Haute Performance

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

Page 89: Multithreading et Calcul Haute Performance

PM2 : architecture logicielle

Légende Marcel : noyau de processus légers Madeleine : module de communication

Marcel PM2 Madeleine

Architecture (grappes, machines parallèles)

Unix (~10 versions)

Interface de programmation (RPC, migration, allocation iso-adresse)

Régulation HPF, C* C++//, Java

Applications

Page 90: Multithreading et Calcul Haute Performance

Marcel : des processus légers

Multiprogrammation spécialisée pour PM2 Sous-ensemble de POSIX + extensions Support pour la migration

Sérialisation des piles de threads Allocation des piles (Iso-Malloc, [Antoniu99])

Gestion mémoire optimisée (cache de piles)

Deux niveaux de threads (noyau et utilisateur) Support des machines SMP Efficacité proche du niveau utilisateur Exploitation des Scheduler Activations sous

Linux Appels systèmes bloquants (Danjean00)

Page 91: Multithreading et Calcul Haute Performance

Marcel: Implantation SMP

Taille du pool de threads noyaux Automatique / option en ligne de commande

Ordonnancement Round-Robin sur chaque LWP Placement sur les LWP paramétrable

marcel_attr_init(&attr);

marcel_attr_setschedpolicy(&attr, MARCEL_SCHED_FIXED(2));

marcel_create(&pid, &attr, func, arg);

...

Page 92: Multithreading et Calcul Haute Performance

Marcel : performances

Comparatif avec d’autres bibliothèques

Performances brutes (meilleur cas)

Opération Version « mono »

Version « SMP »

Chgt contexte 125 ns 212 ns

Création seule 536 ns 1 us

Création + termin.

833 ns 3 us

Arbre de threads

1.232 ms 6.986 ms

OS/Processeur Processus

Thread kernel

Thread user

Marcel

Linux 2.2 / PII 450

0.540 0.130 - 0.006

Solaris 2.7/ PII 350

8.622 0.214 0.160 0.009

Page 93: Multithreading et Calcul Haute Performance

Madeleine : objectifs

Supports des différents protocoles Système (TCP, MPC) Haut-niveau (MPI, PVM) Bas-niveau (BIP, SISCI, VIA,…)

Protocoles multi-paradigmes VIA : message-passing, remote DMA SCI : shared memory, DMA SBP : tampons statiques

Protocoles multi-modes BIP : messages courts, longs

Page 94: Multithreading et Calcul Haute Performance

Madeleine : communications

LRPC, Migration

Madeleine

Interface de programmation

Couche de portabilité

MPI, PVM, TCP, UDP, BIP, SISCI, VIA, SHMEM

Page 95: Multithreading et Calcul Haute Performance

Packing - Unpacking

Commandes: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

Page 96: Multithreading et Calcul Haute Performance

Emission : modes d’empaquetage

Version transmise

Pack

Modification

End_packing

Send_SAFER Send_LATER Send_CHEAPER

Page 97: Multithreading et Calcul Haute Performance

Réception : mode de déballage (1)

Unpack

Après Unpack

End_packing

Tampon

Données disponibles

RECV_EXPRESS

Page 98: Multithreading et Calcul Haute Performance

Réception : mode de déballage (2)

RECV_CHEAPER

Unpack

Après Unpack

End_packing

Tampon

Données disponibles ???

Données disponibles

Page 99: Multithreading et Calcul Haute Performance

Exemple: Protocole BIP/Myrinet

Processus A Processus BRéseau

Acquittement

Message

EntêteVecteur

DMA

Page 100: Multithreading et Calcul Haute Performance

Madeleine sur BIP/Myrinet

Madeleine/BIP

Latence : 8 µsDébit : 125 Mo/s

Migration PM2 : 52 µs

Communication contexte utilisateur (L. Prylli) Zéro copie Contrôle de flux pour les petits messages

Page 101: Multithreading et Calcul Haute Performance

Madeleine : résultats

Performances en latence 6 µs sur SISCI/SCI 8 µs sur BIP/Myrinet

Migration PM2 24 µs sur SISCI/SCI 52 µs sur BIP/Myrinet

Performance en bande passante 125 Mo/s sur BIP/Myrinet

World

record

Page 102: Multithreading et Calcul Haute Performance

Madeleine : d’autres utilisations

Bus CORBA haute performance Collaboration avec Alcatel-INRIA Communications ORB efficaces

Zéro copie avec un ORB? Intégration thread et communication (réactivité) Support du multiprotocoles

MPI-Madeleine Collaboration avec L. Prylli (LIP) Implémentation MPI

Intégration thread et communication (réactivité) Support du multiprotocoles

Page 103: Multithreading et Calcul Haute Performance

Compilation/exécution d’un programme PM2

Fabrication d’un profil Paramétrage de l’environnement

make xconfig- (pm2, debug, madeleine, protocole, marcel, mono-smp)- Géneration d’une flavor

Sélection du profil setenv PM2_FLAVOR=mon_profil

Compilation du programme make

Choix d’une configuration pm2conf myri0 myri1 myri2

Exécution du programme pm2load programme arg1 arg2 … argn

Page 104: Multithreading et Calcul Haute Performance

DSM-PM2 : mémoire partagée et multithreading

Generic, configurable Support for multiple consistency models Multi-protocol support for a given consistency model User interface :

protocol selection/specificationinitial distribution of DSM pages

Thread migration Integrated in consistency protocols Support for adaptive protocols:

page migration vs. thread migration

Page 105: Multithreading et Calcul Haute Performance

Compilation HPF/C* sur PM2

Irrégularité Faible Moyenne ForteBLOCK 3.69 5.34 9.51CYCLIC 5.37 4.34 5.34BLOCK +threads

3.36 3.10 5.32

BLOCK +threads + WS

3.57 2.85 4.45

Simulation de flamme

Align

Disribute

Processors

Thread

s

PM2

Equilibrage dynamique dans HPF/C* (C. Pérez) Modification des exécutifs des compilateurs Module générique d’équilibrage de charge

Page 106: Multithreading et Calcul Haute Performance

Compilation et PM2 (suite)

Projet Hyperion (New Hampshire) Machine virtuelle Java distribuée

Thread Java calqués sur les threads PM2 Mémoire partagée reposant sur DSM-PM2

Grappes de PC

Projet Paris (Rennes) Utilisation de Madeleine (Y. Jégou)

MOME, DSM pour un compilateur HPF

Projet NANOS (Barcelone) Environnement pour machines SMP à l’origine Portage sur PM2 et DSM-PM2 OpenMP

Page 107: Multithreading et Calcul Haute Performance

Lancer de rayons // (PM2)

Transfert technologique (TTN ProHPC) Société AGEMOB

Rendu 3D réaliste de mobilierServeur de calcul pour des chaines de distribution

Projet MOB3D : LIP + AGEMOB + fabricants de meuble

Calcul rapide d’une image réaliste sur réseau de stations

POV-Ray (Persistance Of Vision Ray-tracer) Domaine public, portabilité (Unix, NT) Assez largement utilisé dans la communauté

PM2POVRAY Application parallèle exploitant des grappes de

SMP

Page 108: Multithreading et Calcul Haute Performance

Principe de PM2POV-Ray

Scène répliquée sur chaque machine Découpage de l’image en threads

Régulation de charge Distribution cyclique des threads sur les machines Equilibrage dynamique par migration

P0

P1

P2

P3

P0

P1

P2

P3

Page 109: Multithreading et Calcul Haute Performance

Conclusions

Efficacité et portabilité Bon compromis obtenu pour PM2

Des collaborations Principalement pour des compilateurs et

bibliothèques Stages DEA-DESS, thèse

Disponible sur Internet http://www.pm2.org

Collaborations industrielles Microsoft, Alcatel Aérospatiale-Matra (caches Web)