OpenMP, pour la boucle à l'intérieur de la section
Je voudrais exécuter le code suivant (ci-dessous). Je veux pondre deux threads indépendants, chacun pourrait s'exécuter en parallèle une boucle for. Malheureusement, j'obtiens une erreur. Apparemment, parallèle for
ne peut pas être généré à l'intérieur de section
. Comment résoudre ce problème?
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(10);
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
#pragma omp for
for(int i=0; i<5; i++) {
printf("x %d\n", i);
}
#pragma omp section
#pragma omp for
for(int i=0; i<5; i++) {
printf(". %d\n", i);
}
} //end parallel and end sections
}
Et l'erreur:
main.cpp: In function ‘int main()’:
main.cpp:14:9: warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region [enabled by default]
main.cpp:20:9: warning: work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region [enabled by default]
OriginalL'auteur Jakub M. | 2011-10-27
Vous devez vous connecter pour publier un commentaire.
OpenMP ne peut pas créer des régions parallèles à l'intérieur des régions parallèles. Cela est dû au fait que OpenMP créer au début du programme num_threads fils parallèles, non parallèle régions les autres ne sont pas utilisés et le sommeil. Ils l'ont fait, comme les fréquentes génération de nouveaux threads est assez lent par rapport à l'éveil de couchage threads.
Par conséquent, vous devriez paralléliser seulement les boucles:
Votre droit dans ce cas, il devrait être fixé à 5, mais il devrait y avoir aucun problème si elle est de 10, comme les 5 autres tout simplement ne rien faire.
Je suis d'accord, il se complique pas casser quoi que ce soit.
wikis.sun.com/display/openmp/Tasks+vs+Imbriquée+Parallèle+Régions
OriginalL'auteur tune2fs
Ici, vous devez utiliser parallélisme imbriqué. Le problème avec le
omp for
dans lesections
est que tous les threads dans le cadre de prendre part à laomp for
, et ils ne sont pas — ils sont brisées par les sections. Donc, vous avez à introduire des fonctions, et ne imbriquée paralleism dans les fonctions.omp_set_num_thread()
), ou qui nichaient le parallélisme est activé (omp_set_nested()
) dans le code est quelque part entre le pas-de meilleures pratiques et le type de désagréable; normalement, vous voulez que l'utilisateur soit en mesure de définir ces variables d'environnement. Ils sont définis ici explicitement uniquement pour le tutoriel fins.OriginalL'auteur Jonathan Dursi
Pratiquement, le nombre de threads optimal est égal au nombre de cœurs du PROCESSEUR. De la sorte, chaque parallèle pour doivent être manipulés dans tous les cœurs disponibles, ce qui est impossible à l'intérieur de omp sections. Donc, ce que vous essayez d'atteindre, n'est pas optimal. tune2fs suggestion pour exécuter deux boucles sans les sections du sens et qui donne le meilleur rendement possible. Vous pouvez exécuter des boucles parallèles à l'intérieur d'une autre fonction, mais cette "tricherie" ne donne pas de gain de performance.
Dursi - dans ce cas, votre suggestion est OK. Je pensais surtout à propos des longues boucles - comme dans le traitement de l'image, qui est la principale OpenMP spécialisation.
OriginalL'auteur Alex F