Tous les exemples de didacticiels pour openmp que je vois sont pour créer des threads pour les boucles for. Mais j'ai besoin de créer des threads pour des groupes d'instructions ordinaires qui peuvent être regroupés en fonctions. par exemple, quelque chose comme ce qui suit:créer des threads openmp pour les fonctions
#include <stdio.h>
#include <omp.h>
int A() { printf("in A:%d\n", omp_get_thread_num()); }
int B() { printf("in B:%d\n", omp_get_thread_num()); }
int D() { printf("in D:%d\n", omp_get_thread_num()); }
int E() { printf("in E:%d\n", omp_get_thread_num()); }
int F() { printf("in F:%d\n", omp_get_thread_num()); }
int G() { printf("in G:%d\n", omp_get_thread_num()); }
int H() { printf("in H:%d\n", omp_get_thread_num()); }
int C() {
printf("in C:%d\n", omp_get_thread_num());
#pragma omp parallel num_threads(2)
{
D(); // want to execute D,E in separate threads
E();
}
F();
}
main() {
omp_set_nested(1);
printf("in main:%d\n", omp_get_thread_num());
G();
#pragma omp parallel num_threads(3)
{
A(); // want to execute A,B,C in separate threads
B();
C();
}
H();
}
Dans le code ci-dessus, je veux chaque fonction d'exécuter une seule fois, mais dans différents threads. (Je peux donc me tromper dans le code ci-dessus avec l'utilisation des directives, veuillez le corriger si nécessaire.)
Comment coder ce type de parallélisme imbriqué de fonctions avec openmp? Ces fonctions partageront-elles toutes les variables globales disponibles ou existe-t-il un moyen de spécifier quelles variables seront partagées par quelles fonctions? Après avoir lu la réponse de Jorge Bellon ci-dessous, j'ai codé ce qui suit, et sa sortie est affichée après le code. On dirait que le thread-0 est utilisé pour beaucoup de fonctions, ce qui n'est pas ce que je voulais - je veux que les fonctions soient exécutées en parallèle. De plus, je ne veux qu'une seule exécution pour G, donc je dois supprimer la ligne "num_threads (3)". Faites-moi savoir quelle est la solution à ce problème.
// compile this with: g++ -fopenmp
int A() { printf("in H:%d\n", omp_get_thread_num()); sleep(1); }
// similarly for B, D, E, F, G, H
int C() {
printf("in C:%d\n", omp_get_thread_num()); sleep(1);
#pragma omp task
D();
#pragma omp task
E();
#pragma omp taskwait
F(); sleep(1);
}
main() {
omp_set_nested(1);
printf("in main:%d\n", omp_get_thread_num());
#pragma omp parallel num_threads(3)
G();
#pragma omp task
A();
#pragma omp task
B();
#pragma omp task
C();
#pragma omp taskwait
H();
}
// outputs:
in main:0
in G:1
in G:0
in G:2
in A:0
in B:0
in C:0
in D:0
in E:0
in F:0
in H:0
Merci. J'ai essayé votre solution, mais on dirait que je n'ai qu'un seul fil. Pls voir les détails ajoutés dans la question ci-dessus. – R71
Je n'ai pas besoin que les tâches continuent au-delà d'une jointure locale, donc je n'ai pas besoin des détails des dépendances de tâches. – R71
Vous devez spécifier la portée que les threads vont exécuter en parallèle. Dans le code basé sur les tâches que vous montrez, la portée parallèle est seulement 'G();'. Vous devez utiliser des crochets angulaires '{}' (voir mon exemple) pour définir que la partie parallèle inclura toutes les lignes suivantes jusqu'à la fin de la fonction principale. Pour savoir si les tâches sont exécutées en parallèle, ajoutez la valeur de retour 'get_thread_num()' à 'printf', afin de savoir quel thread exécute cette tâche. –