Considérons le code OpenMP suivant : #include <stdio.h> void work1() {} void work2() {} omp_set_num_threads(4); void example() { #pragma omp parallel { printf("Beginning work1.\n"); work1(); printf("Finishing work1.\n"); printf("Finished work1 and beginning work2.\n"); work2()Répondre aux questions suivantes : a) Expliquer le fonctionnement de la fonction example() (2 points). b) Modifiez cette fonction avec OpenMP pour que les trois messages printf ne s'affichent qu’une seule fois chacun (1 point). c) Prise en compte qu’il n’y a pas de dépendances entre les fonctions work1() et work2(), modifiez le code de la section précédente pour qu’un thread puisse commencer à travailler sur la fonction work2() sans attendre que les messages printf s’affichent (2 points).
时间: 2023-12-03 14:44:40 浏览: 84
a) La fonction example() utilise OpenMP pour exécuter les fonctions work1() et work2() en parallèle sur plusieurs threads. La directive #pragma omp parallel crée une région parallèle, où chaque thread exécute le même code d'une manière indépendante. Les messages printf sont utilisés pour suivre l'exécution des fonctions sur chaque thread.
b) Pour que les trois messages printf ne s'affichent qu'une seule fois chacun, nous pouvons utiliser la directive #pragma omp master pour garantir que seul le thread principal exécute ces instructions. Voici le code modifié :
```
void example() {
#pragma omp parallel
{
printf("Beginning work1.\n");
work1();
printf("Finishing work1.\n");
#pragma omp master
{
printf("Finished work1 and beginning work2.\n");
}
work2();
}
}
```
c) Pour permettre à un thread de commencer à travailler sur la fonction work2() sans attendre que les messages printf s'affichent, nous pouvons utiliser la directive #pragma omp barrier pour forcer tous les threads à attendre jusqu'à ce que tous les autres aient atteint ce point de synchronisation avant de continuer. Voici le code modifié :
```
void example() {
#pragma omp parallel
{
printf("Beginning work1.\n");
work1();
printf("Finishing work1.\n");
#pragma omp barrier
printf("Finished work1 and beginning work2.\n");
work2();
}
}
```
阅读全文