Parallel Programming in C with MPI and OpenMP

Slides:



Advertisements
Présentations similaires
Tris.
Advertisements

Portée des variables VBA & Excel
Fonctions & procédures
Introduction à l’Algorithmique
Calculs de complexité d'algorithmes
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Chap. 1 Structures séquentielles : listes linéaires
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
Initiation à la programmation et algorithmique cours 3
Traitement Co-Séquentiel: Appariment et Fusion de Plusieurs Listes
Parallel Programming in C with MPI and OpenMP
Utilisation des tableaux
ALGORITHMES RECURSIFS
Récursivité.
44 Contrôle du déroulement du programme. 4-2 Objectifs A la fin de ce cours, vous serez capables de : Utiliser les constructions de prise de décision.
MPI (Message Passing Interface)
Analyse lexicale Généralités Expressions rationnelles Automates finis
Les algorithmes: complexité et notation asymptotique
Bibliothèque standard du C++
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que lon veut allouer. Le premier exemple: #include void main()
Methode de Tri efficace
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Les tris.
SELECT {* | Expression [Alias] [,...] } FROM Table [WHERE Condition] [ORDER BY { Expression | Alias } [ ASC | DESC ] [NULLS FIRST | NULLS LAST ] [,...]
Python La programmation objet
Structures de données IFT-2000
Structures de données IFT Abder Alikacem La classe vector Édition Septembre 2009 Département dinformatique et de génie logiciel.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Introduction à l’algorithmique
Introduction à la programmation I Fonctions Structures de contrôle Structures de données (arrays simples et indexés) Variables locales et globales.
Peter Van Roy Département d’Ingénierie Informatique, UCL
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
Parallel Programming in C with MPI and OpenMP
Efficacité des algorithmes
Parallel Programming with MPI and OpenMP Michael J. Quinn.
Chapitre 9 Les sous-programmes.
Gestion de Fichiers GF-10: Traitement Co-Sequentiel: Appariment et Fusion de Plusieures Listes (Base sur les sections de Folk, Zoellick & Riccardi,
Les Algorithmes de Tri Introduction Tri par Sélection
Table de hachage Introduction Notion de clé Fonction de hachage
Tutorat en bio-informatique Le 21 novembre Exercices 2 et 3 (MAT1400) - solutions Chapitre 11.7, Analyse - concepts et contextes vol. 2 27) Cherchez.

Procédures et fonctions
Structures alternative et répétitive
L’essentiel du langage C
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
ALGORITHME DE TRI Le tri par insertion.
ALGORITHMIQUE Recherches : Tris : séquentielle, dichotomique
LES PILES ET FILES.
Méthodes de tri.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que l’on veut allouer. Le premier exemple: #include void main()
Arbres binaires et tables de hachage
Cours 4 - Trois algorithmes de recherche dans un tableau
Les Machines RAM.
ISBN Chapitre 10 L'implémentation des sous- programmes.
Introduction au langage C : Structures de contrôle 1 ère année Génie Informatique Dr Daouda Traoré Université de Ségou
2005/2006 Structures de Données Introduction à la complexité des algorithmes.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Cours 5 - Trois algorithmes de tri d'un tableau
Algorithmes de tri.
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
La pile de crêpes.
Scripts et fonctions Instructions de contrôle
Introduction à la programmation (420-PK2-SL) cours 16 Gestion des applications Technologie de l’information (LEA.BW)
L'exécution d'un programme nécessite l'utilisation des ressources de l'ordinateur : temps de calcul pour exécuter les opérations, et l'occupation de la.
Informatique 2A Langage C 2 è séance. Objectifs de la séance 2 Début de la modularité avec les fonctions Création d’une première bibliothèque.
M. BENJELLOUN : 2005 Le but final est de programmer un jeu où l'ordinateur choisira un nombre aléatoire entre 0 et 100 que vous devez deviner.
Transcription de la présentation:

Parallel Programming in C with MPI and OpenMP Michael J. Quinn

Le crible d’Ératosthène Chapitre 5 Le crible d’Ératosthène

Objectifs Analyse du partitionement d’un tableau Introduction de la fonction MPI_Bcast

Algorithme séquentiel 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 12 12 13 14 14 15 15 16 16 17 18 18 19 20 20 21 21 22 22 23 24 24 25 25 26 26 27 27 28 28 29 30 30 31 32 32 33 33 34 34 35 35 36 36 37 38 38 39 39 40 40 41 42 42 43 44 44 45 45 46 46 47 48 48 49 49 50 50 51 51 52 52 53 54 54 55 55 56 56 57 57 58 58 59 60 60 61 Complexité: (n ln ln n)

Pseudocode 1. Créer une liste non marquée d’entiers 2, 3, …, n 2. k  2 3. Répéter (a) Marquer tous les multiples de k entre k2 et n (b) k  plus petit entier non marqué > k jusqu’à ce que k2 > n 4. Les entiers non marqués sont premiers

Rendre 3(a) Parallèle  Marquer tous les multiple de k entre k2 et n Pour tout j entre k2 et n faire si j mod k = 0 alors marquer j // pas premier

Rendre 3(b) Parallèle  Trouver le plus petit entier non marqué > k Min-reduction: pour trouver le plus petit entier non marqué > k Diffusion (Broadcast): Pour communiquer le résultat

Option de partitionnement Entrelacé (cyclique) Facile de déterminer le « responsable » d’un indice Charge de travail non balancée Par bloc Balance la charge de travail Si n n’est pas un multiple de p alors il est plus difficile de trouver le “responsable” d’un indice.

Partitionnement par bloc On veut balancer la charge de travail Chaque processus reçoit n/p ou n/p elements On recherche des expressions simples pour: Trouver le plus petit et plus grand indice de la partie de tableau d’un processus Trouver le responsable d’un indice

Méthode 1 r = n mod p Si r = 0, tous les blocs ont la même taille Sinon Les premiers r blocs ont une taille n/p Les p-r blocs suivants ont une taille n/p

Exemples 17 elements, 7 processus 17 elements, 5 processus 17 element, 3 processus

Méthode 1: Calculs Premier élément contrôlé par le processus i Dernier élément contrôlé par le processus i Processus contrôlant l’élément j

Méthode 1: Exemple 1 Premier élément contrôlé par le processus i N=12, p=4 0 1 2 3 4 5 6 7 8 9 10 11 Premier élément contrôlé par le processus i Dernier élément contrôlé par le processus i Processus contrôlant l’élément j

Méthode 1: Exemple 2 Premier élément contrôlé par le processus i N=14, p=4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Premier élément contrôlé par le processus i Dernier élément contrôlé par le processus i Processus contrôlant l’élément j

Méthode 2 On disperse les grands blocs parmi les processus Premier élément contrôlé par le processus i Dernier élément contrôlé par le processus i Processus contrôlant l’élément j

Exemples 17 elements, 7 processus 17 elements, 5 processus

Comparaison Notre choix Opérations Méthode 1 Méthode 2 Premier élément 4 2 Dernier élément 6 Responsable 7 En supposant aucune opération pour le calcul du plancher

Macros #define BLOCK_LOW(id,p,n) ((i)*(n)/(p)) #define BLOCK_HIGH(id,p,n) \ (BLOCK_LOW((id)+1,p,n)-1) #define BLOCK_SIZE(id,p,n) \ (BLOCK_LOW((id)+1)-BLOCK_LOW(id)) #define BLOCK_OWNER(index,p,n) \ (((p)*(index)+1)-1)/(n))

Indices locaux et globaux

Indices locaux et globaux Programme séquentiel for (i = 0; i < n; i++) { … } Programme parallèle size = BLOCK_SIZE (id,p,n); for (i = 0; i < size; i++) { gi = i + BLOCK_LOW(id,p,n); Indice local i de ce processus… …correspond à l’indice global gi

Avantage du partitionnement par bloc La plus grande valeur de k possible est n Le premier processus contrôle n/p éléments Il contrôle toutes les valeurs de k possibles si p < n Le premier processus diffuse k aux autres Aucune réduction n’est nécessaire

Avantage du partitionnement par bloc Le partitionnement par bloc permet un marquage identique à la méthode séquentielle: j, j + k, j + 2k, j + 3k, … plutôt que Pour tout j entre k2 et n faire si j mod k = 0 alors marquer j

Développement de l’algorithme parallèle 1. Créer une liste d’entiers non marqués 2, 3, …, n 2. k  2 3. Répéter (a) Marquer tous les multiple de k entre k2 and n (chacun sa partie) (b) k  plus petit entier non marqué > k (processus 0 seulement) (c) Processus 0 diffuse k aux autres processus Jusqu’à ce que k2 > m 4. Les entiers non marqués sont premiers 5. Le nombre de nombres premiers est déterminé par une réduction

Function MPI_Bcast MPI_Bcast (&k, 1, MPI_INT, 0, MPI_COMM_WORLD); int MPI_Bcast ( void *buffer, /* Addr du 1er élément*/ int count, /* # éléments à diffuser*/ MPI_Datatype datatype, /* Type des éléments*/ int root, /* ID du processus racine*/ MPI_Comm comm) /* Communicator */ MPI_Bcast (&k, 1, MPI_INT, 0, MPI_COMM_WORLD);

Code (1/4) #include <mpi.h> #include <math.h> #include <stdio.h> #include "MyMPI.h" #define MIN(a,b) ((a)<(b)?(a):(b)) int main (int argc, char *argv[]) { ... MPI_Init (&argc, &argv); MPI_Barrier(MPI_COMM_WORLD); elapsed_time = -MPI_Wtime(); MPI_Comm_rank (MPI_COMM_WORLD, &id); MPI_Comm_size (MPI_COMM_WORLD, &p); if (argc != 2) { if (!id) printf ("Command line: %s <m>\n", argv[0]); MPI_Finalize(); exit (1); }

Code (2/4) n = atoi(argv[1]); low_value = 2 + BLOCK_LOW(id,p,n-1); high_value = 2 + BLOCK_HIGH(id,p,n-1); size = BLOCK_SIZE(id,p,n-1); proc0_size = (n-1)/p; if ((2 + proc0_size) < (int) sqrt((double) n)) { if (!id) printf ("Too many processes\n"); MPI_Finalize(); exit (1); } marked = (char *) malloc (size); if (marked == NULL) { printf ("Cannot allocate enough memory\n");

Code (3/4) for (i = 0; i < size; i++) marked[i] = 0; if (!id) index = 0; prime = 2; do { if (prime * prime > low_value) first = prime * prime - low_value; else { if (!(low_value % prime)) first = 0; else first = prime - (low_value % prime); } for (i = first; i < size; i += prime) marked[i] = 1; if (!id) { while (marked[++index]); prime = index + 2; MPI_Bcast (&prime, 1, MPI_INT, 0, MPI_COMM_WORLD); } while (prime * prime <= n);

Code (4/4) count = 0; for (i = 0; i < size; i++) if (!marked[i]) count++; MPI_Reduce (&count, &global_count, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); elapsed_time += MPI_Wtime(); if (!id) { printf ("%d primes are less than or equal to %d\n", global_count, n); printf ("Total elapsed time: %10.6f\n", elapsed_time); } MPI_Finalize (); return 0;