Calcul parallèle et distribué, grilles de calculs

Dimension: px
Commencer à balayer dès la page:

Download "Calcul parallèle et distribué, grilles de calculs"

Transcription

1 Calcul parallèle et distribué, grilles de calculs Yann Jullian Université François Rabelais 23 mars 2016

2 Plan 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens 2 Environnement Premier exemple Compilation, exécution Comparaison avec OpenMP Communicateur par défaut 3 Communications point à point Principe Exemple Types de données de base Remarques

3 Plan 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce 5 Modes de communications Fonctions Communications bloquantes

4 Plan Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes 6 Deadlocks Dénition Exemple 7 Types de données dérivés Introduction Extraction contiguë : MPI_Type_contiguous Extraction à pas constant : MPI_Type_vector Extraction à pas variable : MPI_Type_indexed Padding Structure de données MPI_Type_create_struct 8 Communicateurs Partitionner un communicateur 9 Analyse de codes MPI

5 Plan Debug Méthodologie de debug de code MPI Prolage Mesures temporelles simples MPIP MPE OProle Autres problèmes Opérations otantes Race condition

6 Introduction 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

7 Introduction Mémoire partagée 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

8 Introduction Mémoire partagée Une unique machine. Tous les c urs de tous les processeurs ont accès à la mémoire. Noeud 0 C0 C1 C0 C1 C2 C3 C2 C3 C0 C1 C0 C1 Memoire C2 C3 C2 C3 Avantage Parallélisation simple (OpenMP par exemple). Inconvénient Nombre de processeurs et mémoire limités au départ. Pas d'extension possible au delà de la capacité de la machine sur laquelle on exécute.

9 Introduction Mémoire distribuée 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

10 Introduction Mémoire distribuée Plusieurs machines connectées en réseaux. Les processeurs d'un n ud n'ont pas accès aux mémoires des autres n uds. Noeud 0 Noeud 1 C0 C1 C0 C1 C0 C1 C0 C1 C2 C3 C2 C3 C2 C3 C2 C3 C0 C1 C0 C1 Memoire C0 C1 C0 C1 Memoire C2 C3 C2 C3 C2 C3 C2 C3 Avantage Reseau On peut étendre le système en ajoutant des n uds.

11 Introduction Mémoire distribuée Inconvénients Nécessité de transférer la mémoire d'un n ud à l'autre. Le coût de communication réseau peut être élevé si le volume de données à communiquer est important. Le coût d'un transfert réseau sera toujours beaucoup plus important qu'une simple copie mémoire.

12 Introduction Exemples de clusters 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

13 Introduction Exemples de clusters Ada 332 n uds de calculs 4 processeurs Intel E (8 c urs) à 2.7 GHz par n ud c urs 46 To de RAM 233 Tops théoriques, 192 Tops (linpack) Puissance : 244 kwatt Écacité énergétique : 786 Mops / watt

14 Introduction Exemples de clusters Turing 6144 n uds de calculs 16 processeurs POWER A2 (1 c ur) à 1.6 GHz par n ud c urs 96 To de RAM 1258 Tops théoriques, 1073 Tops (linpack) Puissance : 493 kwatt Écacité énergétique : 2176 Mops / watt

15 Introduction Message Passing Interface 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

16 Introduction Message Passing Interface Message Passing Interface (MPI) C'est un ensemble de règles dénissant les communications entre processus, possiblement de n uds diérents. C'est l'outil standard pour les communications dans les clusters. Il en existe plusieurs implémentations dans diérents langages (C, C++ (abandonné avec MPI-3), Fortran) mais peut aussi être appelé depuis Java, Python... Une implémentation fournit un ensemble de fonctions permettant la communication et les échanges de données.

17 Introduction Message Passing Interface Principe d'un code utilisant MPI. Plusieurs processus sont lancés en parallèle. Chaque processus exécute le programme. Le programme décrit le rôle de chaque processus. La bibliothèque se focalise sur la synchronisation des processus et l'échange de données entre ceux-ci.

18 Introduction Message Passing Interface Un message MPI est constitué de : un communicateur (essentiellement un ensemble de processus), un identicateur du processus émetteur, le type de la donnée transférée, sa longueur, la donnée elle même, un identicateur du processus récepteur. Tous ces constituants devront être présent à l'appel des fonctions MPI.

19 Introduction Exemples de domaines d'applications 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

20 Introduction Exemples de domaines d'applications Prévisions météorologique, Cryptographie, Modélisation d'explosion nucléaire, Astrophysique, Dynamique des particules (calculs des interactions), Pattern matching (comparaison d'adn, traitement d'images).

21 Introduction Quelques liens 1 Introduction Mémoire partagée Mémoire distribuée Exemples de clusters Message Passing Interface Exemples de domaines d'applications Quelques liens

22 Introduction Quelques liens Implémentations open source. MPICH2 : OpenMPI : Documentation. Machines. Sources.

23 Environnement 2 Environnement Premier exemple Compilation, exécution Comparaison avec OpenMP Communicateur par défaut

24 Environnement Premier exemple 2 Environnement Premier exemple Compilation, exécution Comparaison avec OpenMP Communicateur par défaut

25 Environnement Premier exemple #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); printf("sup.\n"); MPI_Finalize(); } return 0; Tout programme faisant appel à MPI doit : inclure <mpi.h>, initialiser l'environnement avec MPI_Init, désactiver l'environnement avec MPI_Finalize.

26 Environnement Compilation, exécution 2 Environnement Premier exemple Compilation, exécution Comparaison avec OpenMP Communicateur par défaut

27 Environnement Compilation, exécution $ mpicc -o source source.c $ mpirun source mpicc n'est en fait qu'un appel élaboré à gcc : mpicc -showme Sans plus de précisions, mpirun exécute source une seule fois sur localhost (équivalent à passer l'option n1). L'option n permet de préciser le nombre de processus par machine. La commande mpirun -n 4 source exécute source quatre fois sur localhost.

28 Environnement Compilation, exécution L'option host permet de préciser les machines à utiliser. mpirun -host host0,host1 source exécute source une fois sur host0 et une fois sur host1. On peut combiner n et host. Si le nombre de processus donné est supérieur au nombre de machine, on remonte à la première machine. mpirun -n 3 -host host0,host1 source exécute source une fois sur host0, une fois sur host1, puis une autre fois sur host0.

29 Environnement Compilation, exécution On peut aussi utiliser l'option hostle avec un chier d'entrée. $ cat hosts host0 slots=2 host1 slots=4 mpirun -n 7 -hostle hosts source exécute source deux fois sur host0, quatre fois sur host1, puis une dernière fois sur host0. man mpirun pour plus d'options et plus de détails sur le chier hosts.

30 Environnement Comparaison avec OpenMP 2 Environnement Premier exemple Compilation, exécution Comparaison avec OpenMP Communicateur par défaut

31 Environnement Comparaison avec OpenMP OpenMP MPI Une seule instance du programme est exécutée : il n'y a qu'un seul processus. Le processus se divise en plusieurs threads exécutés en parallèle. Les parties parallèles sont délimités par des directives pré-processeurs (#pragma). Plusieurs instances du programme sont exécutées en même temps : plusieurs processus sont créés. Chaque processus exécute l'intégralité du programme, et les processus s'exécutent en parallèle. MPI_Init et MPI_Finalize ne correspondent pas aux début et n de la partie parallélisée.

32 Environnement Communicateur par défaut 2 Environnement Premier exemple Compilation, exécution Comparaison avec OpenMP Communicateur par défaut

33 Environnement Communicateur par défaut Les processus lancés par mpirun doivent pouvoir communiquer entre eux. Tous les processus sont reliés par le communicateur par défaut MPI_COMM_WORLD. MPI_COMM_WORLD est créé par MPI_Init et détruit par MPI_Finalize. Chaque processus a un rang qui l'identie dans MPI_COMM_WORLD. C'est grâce à ce rang qu'on eectue le partage des tâches. Toutes les communications entre processus passent par un communicateur.

34 Environnement Communicateur par défaut #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); if (wrank!=1) printf("rang %d sur %d.\n", wrank, world_size); } MPI_Finalize(); return 0;

35 Environnement Communicateur par défaut $ mpirun -n 4 source Rang 2 sur 4. Rang 0 sur 4. Rang 3 sur 4. Chaque processus de rang 1 appelle printf (une seule fois) avec son rang. L'ordre de sortie est indéni.

36 Communications point à point 3 Communications point à point Principe Exemple Types de données de base Remarques

37 Communications point à point Principe 3 Communications point à point Principe Exemple Types de données de base Remarques

38 Communications point à point Principe Une communication dite point à point a lieu entre deux processus : l'émetteur et le récepteur (ou destinataire). L'émetteur et le récepteur sont identiés par leur rang dans le communicateur. L'enveloppe d'un message est constituée : du communicateur (qui doit contenir les deux processus), du rang du processus émetteur, du rang du processus récepteur, de l'étiquette (un identiant) du message. Il faut préciser le type des données communiquées. Il existe plusieurs modes de transfert.

39 Communications point à point Exemple 3 Communications point à point Principe Exemple Types de données de base Remarques

40 Communications point à point Exemple int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status); comm : le communicateur. tag : l'identiant du message. dest/source : le rang du processus récepteur/émetteur dans le communicateur comm. datatype : le type des données à envoyer/recevoir. count : le nombre de données de type datatype à envoyer/recevoir. buf : l'adresse du début des données à envoyer/recevoir.

41 Communications point à point Exemple #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int witness = 0; if (wrank==2) { int modifier = 1; MPI_Send(&modifier, 1, MPI_INT, 3, 28, MPI_COMM_WORLD); } else if (wrank==3) MPI_Recv(&witness, 1, MPI_INT, 2, 28, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } printf("rang %d, witness %d.\n", wrank, witness); MPI_Finalize(); return 0;

42 Communications point à point Exemple $ mpirun -n 4 source Rang 1, witness 0. Rang 0, witness 0. Rang 2, witness 0. Rang 3, witness 1. Pour passer plusieurs valeurs : int witness[] = {0, 0}; if (wrank==2) { int modifier[] = {1, 1}; MPI_Send(modifier, 2, MPI_INT, 3, 28, MPI_COMM_WORLD); } else if (wrank==3) MPI_Recv(witness, 2, MPI_INT, 2, 28, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

43 Communications point à point Exemple Note. Pour toutes les communications, il faut préciser à la fois un type pour l'émission et un type pour la réception. Le transfert de données se fait grâce à un simple ux d'octets (pas de données sur le type). C'est au programmeur de vérier que les types d'émission et de réception sont les mêmes, ou au moins qu'ils sont compatibles (voir exemples frames 138 et 143). La communication réussira si le nombre d'octets émis est égal au nombre d'octets reçus. Ainsi, on peut par exemple envoyer un tableau de deux int et recevoir un seul long ou même un seul double.

44 Communications point à point Types de données de base 3 Communications point à point Principe Exemple Types de données de base Remarques

45 Communications point à point Types de données de base Type MPI Type C Taille des types C (octets) MPI_CHAR char 1 MPI_SHORT short 2 MPI_INT int 4 MPI_LONG long int 8 MPI_UNSIGNED_CHAR unsigned char 1 MPI_UNSIGNED_SHORT unsigned short 2 MPI_UNSIGNED unsigned int 4 MPI_UNSIGNED_LONG unsigned long int 8 MPI_FLOAT float 4 MPI_DOUBLE double 8 MPI_LONG_DOUBLE long double 16 Tous les types MPI_* ont pour taille 8 octets.

46 Communications point à point Remarques 3 Communications point à point Principe Exemple Types de données de base Remarques

47 Communications point à point Remarques À la réception d'un message, le rang de l'émetteur et l'étiquette peuvent être des jokers, respectivement MPI_ANY_SOURCE et MPI_ANY_TAG. Le processus récepteur ne sort de l'appel à MPI_Recv que lorsque l'intégralité du message du tag spécié a été reçu. Le processus émetteur, en revanche, peut sortir de l'appel à MPI_Send avant que le message ne soit envoyé (voir frame 107). MPI_STATUS_IGNORE est une constante prédénie qui peut être utilisée à la place de la variable statut. On peut créer et communiquer des structures de données plus complexes (voir frame 150).

48 Communications collectives 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

49 Communications collectives Notions générales 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

50 Communications collectives Notions générales Les communications collectives permettent de faire en une seule opération une série de communications point à point. Une communication collective concerne toujours tous les processus du communicateur indiqué. Pour chacun des processus, l'appel se termine lorsque la participation de celui-ci à l'opération collective est achevée, au sens des communications point-à-point. On ne dénit jamais les étiquettes explicitement ; le système les gère de manière transparente. Avantage : les communications collectives n'interfèrent jamais avec les communications point à point.

51 Communications collectives Notions générales Il y a trois types de communications collectives. 1 Synchronisation globale : MPI_Barrier. 2 Transfert de données uniquement : diusion globale de données : MPI_Bcast, diusion sélective de données : MPI_Scatter, MPI_Scatterv, collecte de données réparties : MPI_Gather, MPI_Gatherv, collecte par tous les processus de données réparties : MPI_Allgather, collecte et diusion sélective, par tous les processus, de données réparties : MPI_Alltoall. 3 Transfert et eectue des opérations sur des données : réduction (somme, produit, maximum, minimum, etc.), qu'elles soient d'un type prédéni ou d'un type personnel : MPI_Reduce, réduction avec diusion du résultat (équivalent à un MPI_Reduce suivi d'un MPI_Bcast ) : MPI_Allreduce.

52 Communications collectives Synchronisation globale : MPI_Barrier 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

53 Communications collectives Synchronisation globale : MPI_Barrier int MPI_Barrier(MPI_Comm comm); P0 P2 Les processus reprennent leurs exécutions. Barrier P1 P3 P0 P1 P2 P3 Processus 3 bloqué en attente des processus 0, 1, 2. Tous les processus ont atteints la barrière. P1 P2 P3 P0 Tous les processus du communicateur doivent appeler la fonction MPI_Barrier. Un processus qui appelle la fonction reste bloqué et doit attendre que tous les autres processus du communicateur l'appellent. Lorsque tous les processus du communicateur ont appelé la fonction, tous reprennent ensemble leurs exécutions.

54 Communications collectives Synchronisation globale : MPI_Barrier #include <mpi.h> #include <stdio.h> #include <time.h> int main(int argc, char ** argv) { MPI_Init(&argc, &argv); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); if (wrank==0) { FILE* f = fopen("outin", "w"); long int seconds = time(null); fprintf(f, "%ld", seconds); fclose(f); } MPI_Barrier(MPI_COMM_WORLD);

55 Communications collectives Synchronisation globale : MPI_Barrier long int witness = 0; FILE* f = fopen("outin", "r"); fscanf(f, "%d", &witness); printf("rang %d, witness %ld.\n", wrank, witness); fclose(f); } MPI_Finalize(); return 0; $ mpirun -n 4 source Rang 1, witness Rang 0, witness Rang 2, witness Rang 3, witness

56 Communications collectives Synchronisation globale : MPI_Barrier Sortie possible si on enlève l'appel à MPI_Barrier. $ mpirun -n 4 source Rang 1, witness Rang 3, witness Rang 0, witness Rang 2, witness Dans ce cas, les processus 1 et 3 ont lu le chier avant que celui-ci ne soit modié par le processus 0, et ils récupèrent donc la valeur contenue dans le chier avant l'exécution du programme. Les processus 0 et 2 ont lu le chier après modication, et récupèrent donc la nouvelle valeur.

57 Communications collectives Synchronisation globale : MPI_Barrier Remarques La fonction MPI_Barrier ne prend pas d'identiant de message en argument. La conséquence est que les processus peuvent appeler des MPI_Barrier diérents (situés à diérents endroits du programme). Ainsi, le code if (wrank==0) MPI_Barrier(MPI_COMM_WORLD); else MPI_Barrier(MPI_COMM_WORLD); aura le même eet que MPI_Barrier(MPI_COMM_WORLD);

58 Communications collectives Synchronisation globale : MPI_Barrier En interne, MPI_Barrier eectue les étapes suivantes : Chaque processus de rang 0 envoie un message vide au processus de rang 0 et attend une réponse, le processus de rang 0 attend d'avoir reçu des messages de tous les processus (sauf lui même), lorsque le processus 0 a reçu tous les messages, il envoie une réponse (un autre message vide) à tous les processus, leur signalant ainsi que tous les processus ont atteints une barrière, les processus 0 quittent MPI_Barrier à la reception de cette réponse, le processus 0 quitte MPI_Barrier après l'envoi de toutes les réponses. MPI_Barrier est l'unique fonction qui permet d'assurer la synchronisation entre les processus. En particulier, aucune des opérations collectives présentées par la suite n'assure la synchronisation.

59 Communications collectives Diusion générale : MPI_Bcast 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

60 Communications collectives Diusion générale : MPI_Bcast int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm); count P0 P1 P2 P3 Tous les processus du communicateur doivent appeler la fonction MPI_Bcast. Le processus de rang root est l'unique émetteur, tous sont récepteurs. Après l'appel, les count données de type datatype pointées par buffer sont égales pour tous les processus.

61 Communications collectives Diusion générale : MPI_Bcast #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int witness = wrank; MPI_Bcast(&witness, 1, MPI_INT, 2, MPI_COMM_WORLD); } printf("rang %d, witness %d.\n", wrank, witness); MPI_Finalize(); return 0; $ mpirun -n 4 source Rang 1, witness 2. Rang 0, witness 2. Rang 2, witness 2. Rang 3, witness 2.

62 Communications collectives Diusion sélective : MPI_Scatter 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

63 Communications collectives Diusion sélective : MPI_Scatter int MPI_Scatter( const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); P0 P1 P2 P3 Tous les processus du communicateur doivent appeler la fonction MPI_Scatter. Le processus de rang root est l'unique emetteur, tous sont récepteurs. sendcount est le nombre de données émises à un seul processus.

64 Communications collectives Diusion sélective : MPI_Scatter MPI_Scatter découpe la donnée à envoyer en plusieurs (autant que de processus dans le communicateur) morceaux de taille sendcount. L'ordre des données envoyés correspond à l'ordre des rangs des processus récepteurs : le ième jeu de données est envoyé au processus de rang i. Le nombre total de données émises est sendcount * (nombre de processus dans le communicateur). sendcount*sizeof(sendtype) == recvcount*sizeof(recvtype) #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank);

65 Communications collectives Diusion sélective : MPI_Scatter } int array[] = {wrank, 2*wrank, 3*wrank, 4*wrank}; int witness=0; MPI_Scatter(array, 1, MPI_INT, &witness, 1, MPI_INT, 2, MPI_COMM_WORLD); printf("rang %d, witness %d.\n", wrank, witness); MPI_Finalize(); return 0; $ mpirun -n 4 source Rang 0, witness 2. Rang 1, witness 4. Rang 2, witness 6. Rang 3, witness 8.

66 Communications collectives Collecte : MPI_Gather 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

67 Communications collectives Collecte : MPI_Gather int MPI_Gather( const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); P0 P1 P2 P3 C'est l'opération inverse de MPI_Scatter. root est l'unique récepteur, tous sont émetteurs. sendcount est le nombre de données émises par un seul processus. Les données sont collectées dans l'ordre des rangs des processus. Mêmes contraintes que MPI_Scatter sur les tailles des données.

68 Communications collectives Collecte : MPI_Gather #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int witness[] = {0, 0, 0, 0}; MPI_Gather(&wrank, 1, MPI_INT, witness, 1, MPI_INT, 2, MPI_COMM_WORLD); printf("rang %d, witness", wrank); for (int i=0; i<4; ++i) printf(" %d", witness[i]); printf(".\n"); } MPI_Finalize(); return 0;

69 Communications collectives Collecte : MPI_Gather $ mpirun -n 4 source Rang 0, witness Rang 3, witness Rang 1, witness Rang 2, witness

70 Communications collectives Collecte générale : MPI_Allgather 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

71 Communications collectives Collecte générale : MPI_Allgather int MPI_Allgather( const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm) P0 P1 P2 P3 Tous les processus sont émetteurs, et tous sont récepteurs. sendcount est le nombre de données émises par un processus, pour un processus. Les données sont collectées dans l'ordre des rangs des processus. Revient à faire MPI_Gather avec le processus 0 comme récepteur, suivi de MPI_Gather avec le processus 1 comme récepteur, et ainsi de suite pour tous les processus.

72 Communications collectives Collecte générale : MPI_Allgather #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int witness[] = {0, 0, 0, 0}; MPI_Allgather(&wrank, 1, MPI_INT, witness, 1, MPI_INT, MPI_COMM_WORLD); printf("rang %d, witness", wrank); for (int i=0; i<4; ++i) printf(" %d", witness[i]); printf(".\n"); } MPI_Finalize(); return 0;

73 Communications collectives Collecte générale : MPI_Allgather $ mpirun -n 4 source Rang 0, witness Rang 3, witness Rang 2, witness Rang 1, witness

74 Communications collectives Diusion : MPI_Scatterv 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

75 Communications collectives Diusion : MPI_Scatterv int MPI_Scatterv( const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) P0 P1 P2 indices P3 Même fonctionnement et propriétés que MPI_Scatter, mais on peut régler le nombre et l'emplacement des données émises avec les arguments sendcounts et displs (displacements / osets). Les deux arguments sendcounts et displs ne servent que pour le processus émetteur. La taille sendcounts et displs est le nombre de processus dans le communicateur.

76 Communications collectives Diusion : MPI_Scatterv P0 P1 P2 indices P3 Seulement pour P2 : P0 P1 P2 P3 recvcount sendbuf de taille = 6, sendcounts = {1, 2, 1, 2} displs = {0, 1, 3, 4}.

77 Communications collectives Diusion : MPI_Scatterv #include <mpi.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { MPI_Init(NULL, NULL); int world_size, wrank; MPI_Comm_size(MPI_COMM_WORLD, &world_size); MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int recvbuf[] = {wrank, wrank}; int recvcount = (wrank%2) + 1; int *sendbuf, *sendcounts, *displs; int total = 6; if (wrank==2) { sendcounts = (int*) calloc(world_size, sizeof(int)); for (int i=0; i<world_size; ++i) sendcounts[i]= (i%2) + 1;

78 Communications collectives Diusion : MPI_Scatterv displs = (int*) calloc(world_size, sizeof(int)); displs[0] = 0; for (int i=1; i<world_size; ++i) displs[i] = displs[i-1] + sendcounts[i-1]; } sendbuf = (int*) calloc(total, sizeof(int)); for (int i=0; i<total; ++i) sendbuf[i] = 28+i; MPI_Scatterv(sendbuf, sendcounts, displs, MPI_INT, recvbuf, recvcount, MPI_INT, 2, MPI_COMM_WORLD); printf("rang %d, recvbuf %d %d.\n", wrank, recvbuf[0], recvbuf[1]); if (wrank==2) { free(sendcounts); free(displs); free(sendbuf); }

79 Communications collectives Diusion : MPI_Scatterv } MPI_Finalize(); return 0; $ mpirun -n 4 source Rang 0, recvbuf Rang 1, recvbuf Rang 2, recvbuf Rang 3, recvbuf

80 Communications collectives Collecte : MPI_Gatherv 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

81 Communications collectives Collecte : MPI_Gatherv int MPI_Gatherv( const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPI_Comm comm) P0 P1 P2 indices P3 Même fonctionnement et propriétés que MPI_Gather, mais on peut régler le nombre et l'emplacement des données reçues avec les arguments recvcounts et displs (displacements / osets). Les deux arguments recvcounts et displs ne servent que pour le processus récepteur. La taille recvcounts et displs est le nombre de processus dans le communicateur.

82 Communications collectives Collecte : MPI_Gatherv P0 P1 P2 indices P3 Seulement pour P2 : P0 P1 P2 P3 sendcount recvbuf de taille = 6, recvcounts = {1, 2, 1, 2} displs = {0, 1, 3, 4}.

83 Communications collectives Collecte : MPI_Gatherv #include <mpi.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int world_size, wrank; MPI_Comm_size(MPI_COMM_WORLD, &world_size); MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int sendbuf[] = {wrank, wrank}; int sendcount = (wrank%2) + 1; int *recvbuf, *recvcounts, *displs; int total = 6; if (wrank==2) { recvcounts = (int*) calloc(world_size, sizeof(int)); for (int i=0; i<world_size; ++i) recvcounts[i]= (i%2) + 1;

84 Communications collectives Collecte : MPI_Gatherv displs = (int*) calloc(world_size, sizeof(int)); displs[0] = 0; for (int i=1; i<world_size; ++i) displs[i] = displs[i-1] + recvcounts[i-1]; } recvbuf = (int*) calloc(total, sizeof(int)); MPI_Gatherv(sendbuf, sendcount, MPI_INT, recvbuf, recvcounts, displs, MPI_INT, 2, MPI_COMM_WORLD); if (wrank==2) { for (int i=0; i<total; ++i) printf("%d ", recvbuf[i]); printf("\n"); } free(recvcounts); free(displs); free(recvbuf);

85 Communications collectives Collecte : MPI_Gatherv } MPI_Finalize(); return 0; $ mpirun -n 4 source

86 Communications collectives Collectes et diusions sélectives : MPI_Alltoall 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

87 Communications collectives Collectes et diusions sélectives : MPI_Alltoall int MPI_Alltoall( const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm) P0 a b c d a a a a P1 a b c d b b b b P2 a b c d c c c c P3 a b c d d d d d Correspond à un MPI_Allgather où la donnée envoyée dépend du processus récepteur. Le ième processus envoie le jème jeu de données au jème processus qui le place dans à la ième place.

88 Communications collectives Collectes et diusions sélectives : MPI_Alltoall #include <math.h> #include <mpi.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int world_size, wrank; MPI_Comm_size(MPI_COMM_WORLD, &world_size); MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int power = pow(10, wrank+1); int sendbuf[] = {power, power+1, power+2, power+3}; int recvbuf[] = {0, 0, 0, 0}; MPI_Alltoall(sendbuf, 1, MPI_INT, recvbuf, 1, MPI_INT, MPI_COMM_WORLD);

89 Communications collectives Collectes et diusions sélectives : MPI_Alltoall printf("rang %d, recvbuf", wrank); for (int i=0; i<world_size; ++i) printf(" %d", recvbuf[i]); printf(".\n"); } MPI_Finalize(); return 0; $ mpirun -n 4 source Rang 0, recvbuf Rang 1, recvbuf Rang 2, recvbuf Rang 3, recvbuf

90 Communications collectives Réductions réparties : MPI_Reduce 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

91 Communications collectives Réductions réparties : MPI_Reduce Une réduction est une opération appliquée à un ensemble d'éléments pour en obtenir une seule valeur. Par exemple, somme/maximum d'éléments venant de plusieurs processus. int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm); P0 1 somme P0 1 maximum P1 10 P1 10 P P P P L'argument op permet de choisir l'opération de réduction. Voir frame 93 pour la liste des opérations prédénies.

92 Communications collectives Réductions réparties : MPI_Reduce Si chaque processus envoie un tableau, la fonction de réduction est appliquée pour chaque indice. P0 1 2 somme P0 1 2 maximum P P P P P P Les fonctions MPI_Op_create et MPI_Op_free permettent de dénir des opérations de réductions personnelles.

93 Communications collectives Réductions réparties : MPI_Reduce Principales opérations de réduction prédénies. Nom MPI_SUM MPI_PROD MPI_MAX MPI_MIN MPI_MAXLOC MPI_MINLOC MPI_LAND MPI_LOR MPI_LXOR Opération Somme des éléments Produit des éléments Maximum des éléments Minimum des éléments Maximum + indice (voir exemple) Minimum + indice (voir exemple) ET logique OU logique OU exclusif logique

94 Communications collectives Réductions réparties : MPI_Reduce, MPI_SUM 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

95 Communications collectives Réductions réparties : MPI_Reduce, MPI_SUM #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); int seeds[] = {wrank, 2*wrank}; int sums[] = {0, 0}; MPI_Reduce(&seeds, &sums, 2, MPI_INT, MPI_SUM, 2, MPI_COMM_WORLD); } printf("rang %d, sums %d %d.\n", wrank, sums[0], sums[1]); MPI_Finalize(); return 0;

96 Communications collectives Réductions réparties : MPI_Reduce, MPI_SUM $ mpirun -n 4 source Rang 1, sums 0 0. Rang 0, sums 0 0. Rang 2, sums Rang 3, sums 0 0.

97 Communications collectives Réductions réparties : MPI_Reduce, MPI_MAXLOC 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

98 Communications collectives Réductions réparties : MPI_Reduce, MPI_MAXLOC #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); struct { double val; int rank; } in, out; in.val = 10*wrank; in.rank = wrank; MPI_Reduce(&in, &out, 1, MPI_DOUBLE_INT, MPI_MAXLOC, 2, MPI_COMM_WORLD); } printf("rang %d, out %f %d.\n", wrank, out.val, out.rank); MPI_Finalize(); return 0;

99 Communications collectives Réductions réparties : MPI_Reduce, MPI_MAXLOC $ mpirun -n 4 source Rang 0, out Rang 3, out Rang 2, out Rang 1, out Utile pour savoir d'où vient le maximum. Il existe d'autres types de paires MPI : MPI_FLOAT_INT, MPI_LONG_INT, MPI_DOUBLE_INT, MPI_SHORT_INT, MPI_2INT, MPI_LONG_DOUBLE_INT.

100 Communications collectives Réductions réparties : MPI_Allreduce 4 Communications collectives Notions générales Synchronisation globale : MPI_Barrier Diusion générale : MPI_Bcast Diusion sélective : MPI_Scatter Collecte : MPI_Gather Collecte générale : MPI_Allgather Diusion : MPI_Scatterv Collecte : MPI_Gatherv Collectes et diusions sélectives : MPI_Alltoall Réductions réparties : MPI_Reduce Réductions réparties : MPI_Reduce, MPI_SUM Réductions réparties : MPI_Reduce, MPI_MAXLOC Réductions réparties : MPI_Allreduce

101 Communications collectives Réductions réparties : MPI_Allreduce int MPI_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); P0 1 2 somme P P P Tous les processus calculent la réduction, et obtiennent donc le même résultat. #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank);

102 Communications collectives Réductions réparties : MPI_Allreduce int seeds[] = {wrank, 2*wrank}; int sums[] = {0, 0}; MPI_Allreduce(&seeds, &sums, 2, MPI_INT, MPI_SUM, MPI_COMM_WORLD); } printf("rang %d, sums %d %d.\n", wrank, sums[0], sums[1]); MPI_Finalize(); return 0; $ mpirun -n 4 source Rang 1, sums Rang 0, sums Rang 2, sums Rang 3, sums 6 12.

103 Modes de communications 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

104 Modes de communications Fonctions 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

105 Modes de communications Fonctions Bloquant Non bloquant Envoi standard MPI_Send MPI_Isend Envoi en mode buerisé MPI_Bsend MPI_Ibsend Envoi en mode synchrone MPI_Ssend MPI_Issend Envoi en mode ready MPI_Rsend MPI_Irsend Réception MPI_Recv MPI_Irecv Le mode utilisé par un envoi standard est décidé par MPI lors de chaque appel. Les fonctions MPI_Send, MPI_Bsend, MPI_Ssend, MPI_Rsend ont toutes le même prototype (voir frame 40) et sont interchangeables dans l'exemple frame 41. Les fonctions MPI_Isend, MPI_Ibsend, MPI_Issend, MPI_Irsend ont toutes le même prototype (voir frame 117) et sont interchangeables dans l'exemple frame 117.

106 Modes de communications Communications bloquantes 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

107 Modes de communications Communications bloquantes On parle d'un appel bloquant lorsque l'espace mémoire servant à la communication (données + enveloppe) peut être réutilisé immédiatement après la sortie de l'appel. Par réutilisé, on veut dire : pour l'émetteur, les éléments du pointeur sur les données à envoyer peuvent être modiés, et le pointeur lui-même peut être libérer sans que cela inue sur la communication (typiquement, la fonction MPI a copié les données à transférer dans un buer temporaire, voir par exemple frame 110), pour le récepteur, le pointeur sur les données à recevoir contient l'intégralité des données transmises et les éléments peuvent être lus.

108 Modes de communications Communications bloquantes Confusion sur le terme bloquant (malheureusement standard) pour l'émetteur. Le terme s'applique à l'espace mémoire contenant les données à transmettre, pas à la communication. Le terme ne signie pas que l'émetteur attend la n de la communication pour sortir de la fonction MPI. L'émetteur peut même sortir de la fonction MPI avant que la transmission de données n'ait démarrée (voir frame 110). Pas de confusion pour le récepteur. Lorsque l'appel à la fonction MPI d'une réception bloquante termine, la communication est eectivement terminée.

109 Modes de communications Envoi bloquant, mode buerisé 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

110 Modes de communications Envoi bloquant, mode buerisé Lors d'un envoi en mode buerisé, le message et l'enveloppe sont copiés à un autre endroit de la mémoire du processus émetteur. Fonction associée : MPI_Bsend. L'appel à MPI_Bsend peut se faire même si le processus récepteur n'est pas encore en attente du message (il n'a pas atteint la fonction de réception). L'appel à MPI_Bsend peut se terminer même si la totalité du message n'a pas été reçu, ou même si le processus récepteur n'a pas atteint la fonction de réception. Si le processus récepteur est en attente du message lors de l'appel à MPI_Bsend, le buer peut être omis.

111 Modes de communications Envoi bloquant, mode synchrone 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

112 Modes de communications Envoi bloquant, mode synchrone Lors d'un envoi en mode synchrone, le processus émetteur doit attendre que la fonction de réception se termine. Fonction associée : MPI_Ssend. L'appel à MPI_Ssend peut se faire même si le processus récepteur n'est pas encore en attente du message (il n'a pas atteint la fonction de réception). C'est un bon moyen de synchroniser les deux processus. Dans le cas d'une réception non bloquante (et uniquement dans ce cas), la fonction de réception, et donc l'appel à MPI_Ssend, peuvent se terminer sans que le message soit complètement transmis.

113 Modes de communications Envoi bloquant, mode ready 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

114 Modes de communications Envoi bloquant, mode ready Un envoi en mode ready n'est correct que si le processus récepteur est déjà en attente du message. Fonction associée : MPI_Rsend. Permet d'omettre certaines opérations de communications, mais nécessite d'ordonnancer les processus. Le comportement adopté lorsque le processus récepteur n'est pas en attente du message est indéni. Très peu utilisé car très risqué.

115 Modes de communications Communications non bloquantes 5 Modes de communications Fonctions Communications bloquantes Envoi bloquant, mode buerisé Envoi bloquant, mode synchrone Envoi bloquant, mode ready Communications non bloquantes

116 Modes de communications Communications non bloquantes Un appel non bloquant démarre l'émission ou la réception d'un message puis termine immédiatement (le programme continue son exécution). Permet de continuer les calculs pendant que la communication s'eectue. Tout appel non bloquant nécessite l'appel à la fonction MPI_Wait (ou une de ses déclinaisons) pour terminer correctement l'appel. Dans le cas d'un envoi non bloquant, la mémoire contenant le message ne doit pas être réutilisée (mais peut être lue) avant l'appel à MPI_Wait. Dans le cas d'une réception non bloquante, la mémoire destinée à recevoir le message ne doit pas être lue avant l'appel à MPI_Wait. Un envoi non bloquant peut être couplé à une réception bloquante et inversement.

117 Modes de communications Communications non bloquantes int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Wait(MPI_Request *request, MPI_Status *status) #include <mpi.h> #include <stdio.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank);

118 Modes de communications Communications non bloquantes int witness = 0; MPI_Request request; if (wrank==2) { int modifier = 1; MPI_Isend(&modifier, 1, MPI_INT, 3, 28, MPI_COMM_WORLD, &request); // Computations. MPI_Wait(&request, MPI_STATUS_IGNORE); } else if (wrank==3) { MPI_Irecv(&witness, 1, MPI_INT, 2, 28, MPI_COMM_WORLD, &request); // Other computations. MPI_Wait(&request, MPI_STATUS_IGNORE); } } printf("rang %d, witness %d.\n", wrank, witness); MPI_Finalize(); return 0;

119 Modes de communications Communications non bloquantes $ mpirun -n 4 source Rang 0, witness 0. Rang 2, witness 0. Rang 3, witness 1. Rang 1, witness 0. L'argument de type MPI_Request est un identiant de l'appel non bloquant. Il faut en allouer un par appel non bloquant.

120 Deadlocks 6 Deadlocks Dénition Exemple

121 Deadlocks Dénition 6 Deadlocks Dénition Exemple

122 Deadlocks Dénition On est en situation de deadlock lorsqu'un processus attend indéniment une action d'un autre processus. Note. Peut arriver lors de communications bloquantes, ou lors d'appel à MPI_Wait. Ils peuvent être provoqués par : un appel à MPI_Recv sans émission correspondante, soit parce qu'il n'y a simplement pas d'émission, soit à cause d'une erreur dans l'enveloppe de l'émission (un tag ou un processus émetteur incorrect), (le plus souvent) un ordonnancement incorrect des émissions / réceptions. Puisque le mode utilisé par MPI_Send n'est décidé qu'à l'appel de la fonction, certains programmes ne provoqueront pas systématiquement un deadlock, même si l'ordonnancement des émissions / réceptions est incorrect.

123 Deadlocks Exemple 6 Deadlocks Dénition Exemple

124 Deadlocks Exemple #include <mpi.h> int main(int argc, char** argv) { MPI_Init(NULL, NULL); int wrank; MPI_Comm_rank(MPI_COMM_WORLD, &wrank); if (wrank==0) { int send0 = 10, recv0; MPI_Send(&send0, 1, MPI_INT, 1, 28, MPI_COMM_WORLD); MPI_Recv(&recv0, 1, MPI_INT, 1, 42, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } else if (wrank==1) { int send1 = 11, recv1; MPI_Send(&send1, 1, MPI_INT, 0, 42, MPI_COMM_WORLD); MPI_Recv(&recv1, 1, MPI_INT, 0, 28, MPI_COMM_WORLD, MPI_STATUS_IGNORE); }

125 Deadlocks Exemple } MPI_Finalize(); return 0; Si les deux appels à MPI_Send se font en mode synchrone, il y aura un deadlock. Si un des appels se fait en mode buerisé, il n'y aura pas de deadlock.

126 Deadlocks Exemple Le même programme avec des MPI_Ssend a place des MPI_Send provoquera systématiquement un deadlock. Une des manières de s'assurer que l'ordonnancement des communications est correct est d'utiliser des MPI_Ssend partout (mais le programme sera un peu plus lent). Une bonne règle d'écriture de programme MPI est de mettre des MPI_Ssend partout dans un premier temps, puis de les remplacer par des MPI_Send lorsqu'on est sûr que toutes les communications s'eectuent correctement.

127 Types de données dérivés 7 Types de données dérivés Introduction Extraction contiguë : MPI_Type_contiguous Extraction à pas constant : MPI_Type_vector Extraction à pas variable : MPI_Type_indexed Padding Structure de données MPI_Type_create_struct

128 Types de données dérivés Introduction 7 Types de données dérivés Introduction Extraction contiguë : MPI_Type_contiguous Extraction à pas constant : MPI_Type_vector Extraction à pas variable : MPI_Type_indexed Padding Structure de données MPI_Type_create_struct

129 Types de données dérivés Introduction Il est possible de créer ses propres types de données MPI. Le type créé sera de type MPI_Datatype. Tout type créé destiné à être utilisé pour une communication doit être enregistré à l'aide de la fonction MPI_Type_commit. int MPI_Type_commit(MPI_Datatype *datatype) Tout type créé avec un MPI_Type_commit doit être libéré par un MPI_Type_free (surtout si on veut réutiliser le nom). int MPI_Type_free(MPI_Datatype *datatype) Deux sortes de types peuvent être créés : extraction de données d'un tableau (MPI_Type_vector, MPI_Type_indexed), des types utilisés pour faire passer les structures qu'on dénit (MPI_Type_create_struct).

130 Types de données dérivés Extraction contiguë : MPI_Type_contiguous 7 Types de données dérivés Introduction Extraction contiguë : MPI_Type_contiguous Extraction à pas constant : MPI_Type_vector Extraction à pas variable : MPI_Type_indexed Padding Structure de données MPI_Type_create_struct

131 Types de données dérivés Extraction contiguë : MPI_Type_contiguous int MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype) count Le nombre total d'éléments de type oldtype contenu dans * newtype est count.

Introduction à la Programmation Parallèle: MPI

Introduction à la Programmation Parallèle: MPI Introduction à la Programmation Parallèle: MPI Frédéric Gava et Gaétan Hains L.A.C.L Laboratoire d Algorithmique, Complexité et Logique Cours du M2 SSI option PSSR Plan 1 Modèle de programmation 2 3 4

Plus en détail

Systèmes parallèles et distribués

Systèmes parallèles et distribués Systèmes parallèles et distribués Grégory Mounié 2013-12 Grégory Mounié Systèmes parallèles et distribués 2013-12 1 / 58 Outline 1 Introduction 2 Performances 3 Problèmes du calcul parallèle 4 Intergiciels

Plus en détail

Plan de la formation. Calcul parallèle avec MPI. Pourquoi paralléliser? Parallélisation. Présentation, environnement MPI. Communications point à point

Plan de la formation. Calcul parallèle avec MPI. Pourquoi paralléliser? Parallélisation. Présentation, environnement MPI. Communications point à point Plan de la formation Calcul parallèle avec MPI Guy Moebs Parallélisation Présentation, environnement MPI Communications point à point Laboratoire de Mathématiques Jean Leray, CNRS, Université de Nantes,

Plus en détail

MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe

MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe 3A-SI Programmation parallèle MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe Stéphane Vialle Stephane.Vialle@supelec.fr http://www.metz.supelec.fr/~vialle MPI-1 2ème partie

Plus en détail

Introduction to Parallel Programming with MPI

Introduction to Parallel Programming with MPI Introduction to Parallel Programming with MPI Master Modélisation et Simulation - ENSTA cours A1-2 Pierre Kestener pierre.kestener@cea.fr CEA-Saclay, DSM, France Maison de la Simulation MDLS, September,

Plus en détail

Le prototype de la fonction main()

Le prototype de la fonction main() Le prototype de la fonction main() 1. Introduction...1 2. Paramètres et type de retour de la fonction main()...1 3. Exemple 1...2 4. La fonction exit() du C...2 5. Détecter le code de retour d un programme

Plus en détail

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année 2003-2004 Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES Maude Manouvrier La reproduction de ce document par

Plus en détail

Programmation système de commandes en C

Programmation système de commandes en C Programmation système de commandes en C Cours de Programmation système Tuyêt Trâm DANG NGOC Université de Cergy-Pontoise 2012 2013 Tuyêt Trâm DANG NGOC Programmation système de commandes

Plus en détail

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier Cours de C Petits secrets du C & programmation avancée Sébastien Paumier paumier@univ-mlv.fr Illustrations provenant du site http://tux.crystalxp.net/ 1 Affectations étendues a+=expression a=a+expression

Plus en détail

Grid Computing. Mihaela JUGANARU-MATHIEU mathieu@emse.fr 2014-2015. École Nationale Supérieure des Mines de St Etienne

Grid Computing. Mihaela JUGANARU-MATHIEU mathieu@emse.fr 2014-2015. École Nationale Supérieure des Mines de St Etienne Mihaela JUGANARU-MATHIEU mathieu@emse.fr École Nationale Supérieure des Mines de St Etienne 2014-2015 Bibliographie (livres et revues) : Frédéric Magoulès, Jie Pan, Kiat-An, Tan Abhinit Kumar Introduction

Plus en détail

Programmation système I Les entrées/sorties

Programmation système I Les entrées/sorties Programmation système I Les entrées/sorties DUT 1 re année Université de Marne La vallée Les entrées-sorties : E/O Entrées/Sorties : Opérations d échanges d informations dans un système informatique. Les

Plus en détail

Introduction au langage C

Introduction au langage C Introduction au langage C Cours 1: Opérations de base et premier programme Alexis Lechervy Alexis Lechervy (UNICAEN) Introduction au langage C 1 / 23 Les premiers pas Sommaire 1 Les premiers pas 2 Les

Plus en détail

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation impérative et structures de données simples Introduction au langage C Sandrine Blazy - 1ère année 24 octobre 2007 Cours d Algorithmique-Programmation

Plus en détail

INFO-F-404 : Techniques avancées de systèmes d exploitation

INFO-F-404 : Techniques avancées de systèmes d exploitation Nikita Veshchikov e-mail : nikita.veshchikov@ulb.ac.be téléphone : 02/650.58.56 bureau : 2N8.213 URL : http://student.ulb.ac.be/~nveshchi/ INFO-F-404 : Techniques avancées de systèmes d exploitation Table

Plus en détail

3IS - Système d'exploitation linux - Programmation système

3IS - Système d'exploitation linux - Programmation système 3IS - Système d'exploitation linux - Programmation système 2010 David Picard Contributions de : Arnaud Revel, Mickaël Maillard picard@ensea.fr Environnement Les programmes peuvent être exécutés dans des

Plus en détail

I. Introduction aux fonctions : les fonctions standards

I. Introduction aux fonctions : les fonctions standards Chapitre 3 : Les fonctions en C++ I. Introduction aux fonctions : les fonctions standards A. Notion de Fonction Imaginons que dans un programme, vous ayez besoin de calculer une racine carrée. Rappelons

Plus en détail

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7 Cahier des charges driver WIFI pour chipset Ralink RT2571W sur hardware ARM7 RevA 13/03/2006 Création du document Sylvain Huet RevB 16/03/2006 Fusion des fonctions ARP et IP. SH Modification des milestones

Plus en détail

OS Réseaux et Programmation Système - C5

OS Réseaux et Programmation Système - C5 OS Réseaux et Programmation Système - C5 Rabie Ben Atitallah rabie.benatitallah@univ-valenciennes.fr RPC - XDR Rappel RPC: Remote Procedure Call Besoin d un environnement de haut niveau pour le développement

Plus en détail

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs Brefs rappels sur la pile et le tas (Stack / Heap) et les pointeurs (exemples en C) v1.11 - Olivier Carles 1 Pile et Tas Mémoire allouée de manière statique Mémoire Allouée Dynamiquement variables locales

Plus en détail

Travaux pratiques. Compression en codage de Huffman. 1.3. Organisation d un projet de programmation

Travaux pratiques. Compression en codage de Huffman. 1.3. Organisation d un projet de programmation Université de Savoie Module ETRS711 Travaux pratiques Compression en codage de Huffman 1. Organisation du projet 1.1. Objectifs Le but de ce projet est d'écrire un programme permettant de compresser des

Plus en détail

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation : Algorithmique et programmation : STRUCTURES DE DONNÉES A. Structure et enregistrement 1) Définition et rôle des structures de données en programmation 1.1) Définition : En informatique, une structure de

Plus en détail

Cours Langage C/C++ Programmation modulaire

Cours Langage C/C++ Programmation modulaire Cours Langage C/C++ Programmation modulaire Thierry Vaira BTS IRIS Avignon tvaira@free.fr «v0.1 Rappel Programmation modulaire (1/2) Le découpage d'un programme en sous-programmes est appelée programmation

Plus en détail

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles) 1/4 Objectif de ce cours /4 Objectifs de ce cours Introduction au langage C - Cours Girardot/Roelens Septembre 013 Du problème au programme I passer d un problème exprimé en français à la réalisation d

Plus en détail

Cours 6 : Tubes anonymes et nommés

Cours 6 : Tubes anonymes et nommés Cours 6 : Tubes anonymes et nommés Mécanisme de communications du système de fichiers I-node associé. Type de fichier: S_IFIFO. Accès au travers des primitives read et write. Les tubes sont unidirectionnels

Plus en détail

Conventions d écriture et outils de mise au point

Conventions d écriture et outils de mise au point Logiciel de base Première année par alternance Responsable : Christophe Rippert Christophe.Rippert@Grenoble-INP.fr Introduction Conventions d écriture et outils de mise au point On va utiliser dans cette

Plus en détail

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE QCM Remarque : - A une question correspond au moins 1 réponse juste - Cocher la ou les bonnes réponses Barème : - Une bonne réponse = +1 - Pas de réponse = 0

Plus en détail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la

Plus en détail

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail Finalités Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail Réalisé par sa modestie Arnaud de VILLEDON de NAIDE, le 9 mars 2013 Document sous licence GPL. Vous avez le droit d'en faire

Plus en détail

Compression de Données - Algorithme de Huffman Document de Conception

Compression de Données - Algorithme de Huffman Document de Conception ROLLET Samuel SALLE Jennifer Compression de Données - Algorithme de Huffman Document de Conception Projet d'algorithmique et Structure des Données 1 SOMMAIRE 1. Domaine d application....4 1.1 Objectifs

Plus en détail

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51 DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51 PLAN DU COURS Introduction au langage C Notions de compilation Variables, types, constantes, tableaux, opérateurs Entrées sorties de base Structures de

Plus en détail

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3. 1. Structure d un programme C Un programme est un ensemble de fonctions. La fonction "main" constitue le point d entrée pour l exécution. Un exemple simple : #include int main() { printf ( this

Plus en détail

Arguments d un programme

Arguments d un programme Arguments d un programme L2 SPI, Bruno Jacob 1 Arguments Quand on appelle un programme dans un environnement UNIX ou MS- DOS, on compose une ligne de commandes de la forme : nom-du-programme argument1

Plus en détail

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN Mémoire DNS Server RPC Interface buffer overflow Céline COLLUMEAU Nicolas BODIN 3 janvier 2009 Table des matières 1 Introduction 2 2 Présentation de la faille 3 3 Exemple d exploitation 5 4 Solutions 10

Plus en détail

Cours Programmation Système

Cours Programmation Système Cours Programmation Système Filière SMI Semestre S6 El Mostafa DAOUDI Département de Mathématiques et d Informatique, Faculté des Sciences Université Mohammed Premier Oujda m.daoudi@fso.ump.ma Février

Plus en détail

Programmation système en C/C++

Programmation système en C/C++ Programmation système en C/C++ Jean-Baptiste Vioix (jb.vioix@free.fr) LE2I - ENESAD http://jb.vioix.free.fr 1-41 Programmation en C/C++ sous Unix Il existe des très nombreux outils de développement sous

Plus en détail

Les communications collectives. Caractéristiques. Communications dans un groupe de processus. Dans un communicateur donné.

Les communications collectives. Caractéristiques. Communications dans un groupe de processus. Dans un communicateur donné. Les communications collectives Communications dans un groupe de processus. Dans un communicateur donné. Trois sortes : Synchronisation globale MI_Barrier() Transferts de données : diffusion/collecte globale/sélective

Plus en détail

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu. Seance 2: Complétion du code de jeu. (durée max: 2h) Mot clé const et pointeurs: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu. Implémentez jeu_recupere_piece

Plus en détail

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr Table des matières 1 Les bases 3 2 Variables et constantes 5 3 Quelques fonctions indispensables

Plus en détail

Introduction au calcul parallèle avec OpenCL

Introduction au calcul parallèle avec OpenCL Introduction au calcul parallèle avec OpenCL Julien Dehos Séminaire du 05/01/2012 Sommaire Introduction Le calculateur du CGR/LISIC/LMPA Généralités sur OpenCL Modèles Programmation Optimisation Conclusion

Plus en détail

Généralités sur le Langage Java et éléments syntaxiques.

Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...

Plus en détail

IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

IN 102 - Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C IN 102 - Cours 1 Qu on le veuille ou non, les systèmes informatisés sont désormais omniprésents. Même si ne vous destinez pas à l informatique, vous avez de très grandes chances d y être confrontés en

Plus en détail

Rappels Entrées -Sorties

Rappels Entrées -Sorties Fonctions printf et scanf Syntaxe: écriture, organisation Comportement Données hétérogènes? Gestion des erreurs des utilisateurs 17/11/2013 Cours du Langage C ibr_guelzim@yahoo.fr ibrahimguelzim.atspace.co.uk

Plus en détail

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations

Plus en détail

IRL : Simulation distribuée pour les systèmes embarqués

IRL : Simulation distribuée pour les systèmes embarqués IRL : Simulation distribuée pour les systèmes embarqués Yassine El Khadiri, 2 ème année Ensimag, Grenoble INP Matthieu Moy, Verimag Denis Becker, Verimag 19 mai 2015 1 Table des matières 1 MPI et la sérialisation

Plus en détail

Lier Erlang avec d autres langages de programmation

Lier Erlang avec d autres langages de programmation 16 Lier Erlang avec d autres langages de programmation Les logiciels actuels, quelle que soit leur taille, sont souvent écrits dans plusieurs langages de programmation. Généralement, les pilotes de périphériques

Plus en détail

Les chaînes de caractères

Les chaînes de caractères Les chaînes de caractères Dans un programme informatique, les chaînes de caractères servent à stocker les informations non numériques comme par exemple une liste de nom de personne ou des adresses. Il

Plus en détail

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing 3/4/27 Programmation Avancée Multimédia Multithreading Benoît Piranda Équipe SISAR Université de Marne La Vallée Besoin Programmes à traitements simultanés Réseau Réseau Afficher une animation en temps

Plus en détail

Programmation en langage C

Programmation en langage C Programmation en langage C Anne CANTEAUT INRIA - projet CODES B.P. 105 78153 Le Chesnay Cedex Anne.Canteaut@inria.fr http://www-rocq.inria.fr/codes/anne.canteaut/cours C 2 Table des matières 3 Table des

Plus en détail

COMPARAISONDESLANGAGESC, C++, JAVA ET

COMPARAISONDESLANGAGESC, C++, JAVA ET REPUBLIQUE DU BENIN *******@******* MINISTERE DE L ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE(MESRS) *******@******* UNIVERSITE D ABOMEY CALAVI(UAC) *******@******* ECOLE POLYTECHNIQUE D ABPOMEY

Plus en détail

Runtime. Gestion de la réactivité des communications réseau. François Trahay Runtime, LaBRI sous la direction d'alexandre Denis Université Bordeaux I

Runtime. Gestion de la réactivité des communications réseau. François Trahay Runtime, LaBRI sous la direction d'alexandre Denis Université Bordeaux I Runtime Gestion de la réactivité des communications réseau François Trahay Runtime, LaBRI sous la direction d'alexandre Denis Université Bordeaux I 1 Le calcul hautes performances La tendance actuelle

Plus en détail

Exercices INF5171 : série #3 (Automne 2012)

Exercices INF5171 : série #3 (Automne 2012) Exercices INF5171 : série #3 (Automne 2012) 1. Un moniteur pour gérer des ressources Le moniteur MPD 1 présente une première version d'un moniteur, exprimé en pseudo-mpd, pour gérer des ressources le nombre

Plus en détail

INF 104 (SELC) 2012-2013 Introduction au langage C

INF 104 (SELC) 2012-2013 Introduction au langage C INF 104 (SELC) 2012-2013 Introduction au langage C Plan Première partie C après Java Structure d un programme Préprocesseur Variables Types de base Types composés Pointeurs(1) Instructions Deuxième partie

Plus en détail

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface

Plus en détail

Gestion de la mémoire

Gestion de la mémoire 433 43 3 Gestion de la mémoire + 1. Qu'est-ce que la mémoire? - Définitions, exemples 2. Allocation contiguë en mémoire - Partitions de taille fixe, de taille variable 3. Pagination et mémoire virtuelle

Plus en détail

Algorithmique et Programmation, IMA

Algorithmique et Programmation, IMA Algorithmique et Programmation, IMA Cours 2 : C Premier Niveau / Algorithmique Université Lille 1 - Polytech Lille Notations, identificateurs Variables et Types de base Expressions Constantes Instructions

Plus en détail

Les processus légers : threads. Système L3, 2014-2015 1/31

Les processus légers : threads. Système L3, 2014-2015 1/31 Les processus légers : threads Système L3, 2014-2015 1/31 Les threads Les threads sont des processus légers exécutés à l intérieur d un processus L exécution des threads est concurrente Il existe toujours

Plus en détail

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/2011. 1.1 Présentation. 1.2 Ressources

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/2011. 1.1 Présentation. 1.2 Ressources Master Maths Finances 2010/2011 Data Mining janvier 2011 RapidMiner 1 Introduction 1.1 Présentation RapidMiner est un logiciel open source et gratuit dédié au data mining. Il contient de nombreux outils

Plus en détail

Cours de C. Allocation dynamique. Sébastien Paumier

Cours de C. Allocation dynamique. Sébastien Paumier Cours de C Allocation dynamique Sébastien Paumier paumier@univ-mlv.fr Illustrations provenant du site http://tux.crystalxp.net/ 1 Les pointeurs pointeur=adresse mémoire+type type* nom; nom pointe sur une

Plus en détail

Programmation impérative

Programmation impérative Programmation impérative Cours 4 : Manipulation des fichiers en C Catalin Dima Organisation des fichiers Qqs caractéristiques des fichiers : Nom (+ extension). Chemin d accès absolu = suite des noms des

Plus en détail

Le système de gestion des fichiers, les entrées/sorties.

Le système de gestion des fichiers, les entrées/sorties. Le système de gestion des fichiers, les entrées/sorties. Luigi Santocanale Laboratoire d Informatique Fondamentale, Centre de Mathématiques et Informatique, 39, rue Joliot-Curie - F-13453 Marseille 19

Plus en détail

Chapitre 1 : La gestion dynamique de la mémoire

Chapitre 1 : La gestion dynamique de la mémoire Chapitre 1 : La gestion dynamique de la mémoire En langage C un programme comporte trois types de données : Statiques; Automatiques ; Dynamiques. Les données statiques occupent un emplacement parfaitement

Plus en détail

Premiers Pas en Programmation Objet : les Classes et les Objets

Premiers Pas en Programmation Objet : les Classes et les Objets Chapitre 2 Premiers Pas en Programmation Objet : les Classes et les Objets Dans la première partie de ce cours, nous avons appris à manipuler des objets de type simple : entiers, doubles, caractères, booléens.

Plus en détail

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Structure d un programme et Compilation Notions de classe et d objet Syntaxe Cours1 Structure d un programme et Compilation Notions de classe et d objet Syntaxe POO 1 Programmation Orientée Objet Un ensemble d objet qui communiquent Pourquoi POO Conception abstraction sur les types

Plus en détail

Cours 1: Java et les objets

Cours 1: Java et les objets Ressources Les interface homme-machine et le langage Java DUT première année Henri Garreta, Faculté des Sciences (Luminy) Cyril Pain-Barre & Sébastien Nedjar, IUT d Aix-Marseille (Aix) Cours 1: infodoc.iut.univ-aix.fr/~ihm/

Plus en détail

Le langage C. Séance n 4

Le langage C. Séance n 4 Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de

Plus en détail

Cours 14 Les fichiers

Cours 14 Les fichiers Cours 14 Les fichiers F. Gayral 1 Fichier : définition /media/travaux/documents/fgenseignement/java1/courstpsfgfc/14-fichiers/voirtypefichiers Fichier = ensemble d informations codées et stockées sur une

Plus en détail

Introduction à la programmation concurrente

Introduction à la programmation concurrente Introduction à la programmation concurrente Moniteurs Yann Thoma Reconfigurable and Embedded Digital Systems Institute Haute Ecole d Ingénierie et de Gestion du Canton de Vaud This work is licensed under

Plus en détail

Grid Computing. Plan du cours. Plan. Composants d une Grille. Nouredine.Melab@lifl.fr. Besoin d intergiciels robustes

Grid Computing. Plan du cours. Plan. Composants d une Grille. Nouredine.Melab@lifl.fr. Besoin d intergiciels robustes Grid Computing Plan du cours Nouredine.Melab@lifl.fr Les grilles informatiques : concepts et infrastructures La grille nationale Grid5000 Modèles de programmation et intergiciels pour le grilles Etude

Plus en détail

Architecture des ordinateurs

Architecture des ordinateurs Architecture des ordinateurs Cours 4 5 novembre 2012 Archi 1/22 Micro-architecture Archi 2/22 Intro Comment assembler les différents circuits vus dans les cours précédents pour fabriquer un processeur?

Plus en détail

Java Licence Professionnelle CISII, 2009-10

Java Licence Professionnelle CISII, 2009-10 Java Licence Professionnelle CISII, 2009-10 Cours 4 : Programmation structurée (c) http://www.loria.fr/~tabbone/cours.html 1 Principe - Les méthodes sont structurées en blocs par les structures de la programmation

Plus en détail

Recherche dans un tableau

Recherche dans un tableau Chapitre 3 Recherche dans un tableau 3.1 Introduction 3.1.1 Tranche On appelle tranche de tableau, la donnée d'un tableau t et de deux indices a et b. On note cette tranche t.(a..b). Exemple 3.1 : 3 6

Plus en détail

Programmation Réseau SSH et TLS (aka SSL)

Programmation Réseau SSH et TLS (aka SSL) Programmation Réseau SSH et TLS (aka SSL) Jean-Baptiste.Yunes@liafa.jussieu.fr Coloriages: François Armand armand@informatique.univ-paris-diderot.fr UFR Informatique 2011-2012 Réseau et Sécurité Problèmes

Plus en détail

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation C. Apprendre à développer des programmes simples dans le langage C Programmation C Apprendre à développer des programmes simples dans le langage C Notes de cours sont disponibles sur http://astro.u-strasbg.fr/scyon/stusm (attention les majuscules sont importantes) Modalités

Plus en détail

Bases de programmation. Cours 5. Structurer les données

Bases de programmation. Cours 5. Structurer les données Bases de programmation. Cours 5. Structurer les données Pierre Boudes 1 er décembre 2014 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Types char et

Plus en détail

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie Chapitre I : Les bases du C++ Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie du logiciel, et ce depuis

Plus en détail

Licence ST Université Claude Bernard Lyon I LIF1 : Algorithmique et Programmation C Bases du langage C 1 Conclusion de la dernière fois Introduction de l algorithmique générale pour permettre de traiter

Plus en détail

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux. UEO11 COURS/TD 1 Contenu du semestre Cours et TDs sont intégrés L objectif de ce cours équivalent a 6h de cours, 10h de TD et 8h de TP est le suivant : - initiation à l algorithmique - notions de bases

Plus en détail

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation C. J.-F. Lalande. 15 novembre 2012 Programmation C J.-F. Lalande novembre 0 Ce cours est mis à disposition par Jean-François Lalande selon les termes de la licence Creative Commons Attribution - Pas d Utilisation Commerciale - Partage à

Plus en détail

I00 Éléments d architecture

I00 Éléments d architecture I00 I Exemples d ordinateur Pour les informaticiens, différentes machines de la vie courante sont des ordinateurs : par exemple les ordinateurs portables, les ordinateurs fixes, mais aussi les supercalculateurs,

Plus en détail

Génération de code binaire pour application multimedia : une approche au vol

Génération de code binaire pour application multimedia : une approche au vol Génération de binaire pour application multimedia : une approche au vol http://hpbcg.org/ Henri-Pierre Charles Université de Versailles Saint-Quentin en Yvelines 3 Octobre 2009 Présentation Présentation

Plus en détail

DÉVELOPPEMENT INFONUAGIQUE - meilleures pratiques

DÉVELOPPEMENT INFONUAGIQUE - meilleures pratiques livre blanc DÉVELOPPEMENT INFONUAGIQUE MEILLEURES PRATIQUES ET APPLICATIONS DE SOUTIEN DÉVELOPPEMENT INFONUAGIQUE - MEILLEURES PRATIQUES 1 Les solutions infonuagiques sont de plus en plus présentes sur

Plus en détail

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski cegielski@u-pec.fr Mars 2002 Pour Irène et Marie Legal Notice Copyright c 2002 Patrick Cégielski Université

Plus en détail

Groupe calcul parallèle

Groupe calcul parallèle Groupe calcul parallèle «Exploiter le potentiel des nouvelles architectures» Vincent Lafage Luz Guevara Ivana Hrivnacova Christophe Diarra Contact :Luz Guevara e-mail : guevara@ipno.in2p3.fr Tel : 54463

Plus en détail

Chapitre 1 : Introduction aux bases de données

Chapitre 1 : Introduction aux bases de données Chapitre 1 : Introduction aux bases de données Les Bases de Données occupent aujourd'hui une place de plus en plus importante dans les systèmes informatiques. Les Systèmes de Gestion de Bases de Données

Plus en détail

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence Licence Algorithmique & Langage C Paternité - Pas d'utilisation Commerciale Partage des Conditions Initiales à l'identique 2.0 France Vous êtes libres : * de reproduire, distribuer et communiquer cette

Plus en détail

Communication par sockets

Communication par sockets Rappel : le réseau vu de l!utilisateur (1) Communication par sockets Sacha Krakowiak Université Joseph Fourier Projet Sardes (INRIA et IMAG-LSR) http://sardes.inrialpes.fr/~krakowia (demande un service)

Plus en détail

Chap III : Les tableaux

Chap III : Les tableaux Chap III : Les tableaux Dans cette partie, on va étudier quelques structures de données de base tels que : Les tableaux (vecteur et matrice) Les chaînes de caractères LA STRUCTURE DE TABLEAU Introduction

Plus en détail

Initiation. àl algorithmique et à la programmation. en C

Initiation. àl algorithmique et à la programmation. en C Initiation àl algorithmique et à la programmation en C Initiation àl algorithmique et à la programmation en C Cours avec 129 exercices corrigés Illustration de couverture : alwyncooper - istock.com Dunod,

Plus en détail

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs) Modularité Extensions Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs) généricité modules de première classe : peuvent être

Plus en détail

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40 Déroulement du cours Introduction Concepts Java Remarques Langage et Concepts de Programmation Orientée-Objet Gauthier Picard École Nationale Supérieure des Mines de Saint-Étienne gauthier.picard@emse.fr

Plus en détail

Systèmes distribués et virtualisation de ressources

Systèmes distribués et virtualisation de ressources p. 1/18 Systèmes distribués et virtualisation de ressources Tanguy RISSET (Transparents : Antoine Fraboulet) tanguy.risset@insa-lyon.fr p. 2/18 Plan 1 Distribution de ressources 1. Distribution de ressources

Plus en détail

Chapitre 2. Classes et objets

Chapitre 2. Classes et objets Chapitre 2: Classes et Objets 1/10 Chapitre 2 Classes et objets Chapitre 2: Classes et Objets 2/10 Approche Orientée Objet Idée de base de A.O.O. repose sur l'observation de la façon dont nous procédons

Plus en détail

TP2 - Conguration réseau et commandes utiles. 1 Généralités. 2 Conguration de la machine. 2.1 Commande hostname

TP2 - Conguration réseau et commandes utiles. 1 Généralités. 2 Conguration de la machine. 2.1 Commande hostname Département d'informatique Architecture des réseaux TP2 - Conguration réseau et commandes utiles L'objectif de ce TP est d'une part de vous présenter la conguration réseau d'une machine dans l'environnement

Plus en détail

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers. I Présentation : Dans le chapitre 1, nous avons vu comment utiliser les appels-systèmes de bas niveau pour créer et accéder à des fichiers sur le disque. Nous avons notamment mis en évidence leur dépouillement

Plus en détail

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février 2014 17:30 à 20:30

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février 2014 17:30 à 20:30 Examen intra 20 février 2014 17:30 à 20:30 Nom, prénom : Code permanent : Répondez directement sur le questionnaire. Question #1 5% Quelle influence peut avoir le typage dynamique sur la maintenabilité

Plus en détail

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; }; #include #include struct cell int clef; struct cell suiv; ; / longueur. pc->suiv est l abréviation de (pc).suiv. pour cette fonction comme pour les suivantes, on donne, lorsqu il existe

Plus en détail

Programmation Structurée en Langage C

Programmation Structurée en Langage C École Centrale Marseille Programmation Structurée en Langage C Stéphane Derrode Mathématique et Informatique Révision 2.5, 2006. Table des matières 1 En guise d'introduction... 7 1.1 Quelques repères

Plus en détail

Le traitement du temps

Le traitement du temps Programmation Système Mesure Horloges Sommeil Mise en forme Fabrice Harrouet École Nationale d Ingénieurs de Brest harrouet@enib.fr http://www.enib.fr/~harrouet/ enib, F.H... 1/30 Intérêt Cadencer les

Plus en détail

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d initiation à la programmation en C++ Johann Cuenin Cours d initiation à la programmation en C++ Johann Cuenin 11 octobre 2014 2 Table des matières 1 Introduction 5 2 Bases de la programmation en C++ 7 3 Les types composés 9 3.1 Les tableaux.............................

Plus en détail

Programmation en C - Sommaire

Programmation en C - Sommaire Programmation en C - Sommaire PROGRAMMATION EN C - SOMMAIRE... 1 CHAPITRE 0 : INTRODUCTION :... 5 I) NOTATIONS ET SYMBOLES :... 5 II) C, LA NAISSANCE D'UN LANGAGE DE PROGRAMMATION PORTABLE... :... 6 1)

Plus en détail