Vous êtes sur la page 1sur 18

Université Mohammed Premier

Faculté Pluridisciplinaire de Nador


Département Informatique
Master Sciences des Données et Systèmes Intelligents

Calcul parallèle
TRAVAUX PRATIQUES
2022/2023
TP1: Installation C C++ toolset
Nous allons d'abord télécharger et installer msys2
◦ Accéder au site : mingw-w64.org
◦ Puis la page : Downloads
◦ Puis choisir MSYS2
◦ Cliquer sur le lien :

◦ Cliquer sur le lien :


TP1: Installation C C++ toolset
Exécutez le programme d'installation. Et suivez les étapes d’installation.

Une fois terminé, cliquez sur Terminer.


TP1: Installation C C++ toolset
Maintenant MSYS2 est prêt pour vous et un terminal pour l'environnement UCRT64 va se
lancer.
TP1: Installation C C++ toolset
Mettez à jour la base de données de packages et les packages de base à l'aide de:
◦ pacman -Syu

Mettre à jour le reste des packages de base:


◦ pacman -Su
TP1: Installation C C++ toolset
Ouvrez maintenant le terminal Msys MinGW
Pour obtenir la liste des bibliothèques :

◦ Pacman –Ss gcc

Pour installer gcc et g++ pour C et C++


Pour 64 bit
◦ pacman -S mingw-w64-x86_64-gcc

Pour 32 bit
◦ pacman -S mingw-w64-i686-gcc
TP1: Installation C C++ toolset
Pour installer le débogueur ( gdb ) pour C et C++
Pour 64 bit
◦ pacman -S mingw-w64-x86_64-gdb

Pour 32 bit
◦ pacman -S mingw-w64-i686-gdb
TP1: Installation C C++ toolset
Pour vérifier les versions installées:
Version gcc : gcc --version
Version g++ : g++ --version
Version gdb : gdb --version
TP1: Installation C C++ toolset
Premier programme:
Pour commencer, un programme élémentaire va être pris comme exemple pour montrer
l'utilisation générale d'OpenMP. Ce programme est présenté ci-dessous, la boucle représente le
traitement de différents éléments de manière séquentielle.
#include<stdio.h>
int main (){
int n;
for(n=0;n<8;n++){
printf("Element %d traité\n",n);
}
return 0;
}
La compilation se fait avec la ligne :
gcc -oPremierProgramme PremierProgramme.c
TP1: Installation C C++ toolset
Premier programme:
Nous allons maintenant modifier ce programme pour que le traitement des différents éléments se fasse de manière
simultanée. Le programme modifié est le suivant :
#include<stdio.h>
#include<omp.h>
int main (){
int n;
#pragma omp parallel for
for(n=0;n<8;n++){
printf("Element %d traité par le thread %d \n",n,omp_get_thread_num());
}
return 0;
}
La compilation se fait avec la ligne :
gcc –fopenmp -oPremierProgramme PremierProgramme.c
TP1: Installation C C++ toolset
Fixer le nombre de threads:
Le programme modifié est le suivant :
#include<stdio.h>
#include<omp.h>
int main (){
int n;
#pragma omp parallel for num_threads(4)
for(n=0;n<8;n++){
printf("Element %d traité par le thread %d \n",n,omp_get_thread_num());
}
return 0;
}
La compilation se fait avec la ligne :
gcc –fopenmp -oPremierProgramme PremierProgramme.c
TP1: Installation C C++ toolset
Exercice 1 :
Ecrire un programme OpenMP qui affiche pour chaque thread le message : « Hello from
thread : ».
Le processus de rang 0 devra également afficher le nombre total de processus céés.
TP2: Initialisation à OpenMP
Tester les différents statuts des variables: private, shared, firstprivate,
Exercice 2 :
#include <stdio.h>
#include <omp.h>
int main () {
int nthreads,tid,a=1000;
// Fork un ensemble de threads en donnant à chacun sa copie de variables
#pragma omp parallel
{
tid = omp_get_thread_num();
nthreads = omp_get_num_threads();
a=a+20;
printf("Hello my thread id is = %d out of %d a=%d\n", tid,nthreads,a);
}
printf("After parallel region a = %d\n",a );
}
TP2: Initialisation à OpenMP
Boucle parallèle
Exercice 3 : copier le code suivant dans un fichier nommé loop.c
#include <stdio.h>
#include <omp.h>
int main (int argc, char *argv[]) {
int tid, num_loops, i , n=1000 ;
#pragma omp parallel private(tid) {
◦ tid = omp_get_thread_num() ;
num_loops=0 ;
#pragma omp for
for (i=1; i<n ; i++)
num_loops = num_loops+1;
printf ("Hello my thread id is = %d number of loops %d\n", tid,num_loops) ; }
printf("total loops %d",num_loops);
}
TP2: Initialisation à OpenMP
Boucle parallèle
Exercice 3 :
1. Compiler et exécuter le programme avec 4 threads.
2. Est-ce que le nombre de boucles est cohérent ?
3. Changer le statut de la variable num_loops à private et réexécuter .
La valeur num_loops n’a pas de sens hors la région parallèle , pour avoir la
somme du nombre de boucles utilisez la directive reduction qui permet de
sommer les valeurs de la variable privée num_loops en fin de la région
parallèle
4. Supprimer num_loops de de la directive private et ajouter reduction(
+:num_loops) après la directive private
TP2: Initialisation à OpenMP
Schedule
Exercice 4 :
Utiliser le programme précédent en changeant le Scheduling
Compiler et exécuter le programme en variant le nombre de threads
et le Sheduling
schedule(static ,dynamic ou guided)
TP2: Initialisation à OpenMP
Reduction
Exercice 5 : Produit scalaire séquentiel
#include <stdio.h>
#define SIZE 256
int main () {
double sum , a[SIZE], b[SIZE ];
// Initialization sum = 0.;
for (size_t i = 0; i < SIZE; i++) {
a[i] = i * 0.5;
b[i] = i * 2.0;
}
// Computation
for (size_t i = 0; i < SIZE; i++)
sum = sum + a[i]*b[i];
printf("sum = %g\n", sum);
return 0;
}
TP2: Initialisation à OpenMP
Reduction
Exercice 5 : Produit scalaire OpenMP
#include <stdio.h>
#include <omp.h>
#define SIZE 256
int main () {
double sum , a[SIZE], b[SIZE ];
// Initialization sum = 0.;
for (size_t i = 0; i < SIZE; i++) {
a[i] = i * 0.5;
b[i] = i * 2.0;
}
// Computation
#pragma omp parallel for reduction(+: sum)
for (size_t i = 0; i < SIZE; i++) { sum = sum + a[i]*b[i];
}
printf("sum = %g\n", sum);
return 0;
}

Vous aimerez peut-être aussi