Comment OpenMP poignée de boucles imbriquées?
Le code suivant juste paralléliser le premier (externe) des boucles, ou il paralléliser l'ensemble de boucles imbriquées?
#pragma omp parallel for
for (int i=0;i<N;i++)
{
for (int j=0;j<M;j++)
{
//do task(i,j)//
}
}
Je veux juste m'assurer que si le code ci-dessus paralléliser l'ensemble imbriqué pour des boucles (donc un thread directement liées à la tâche(i,j)), ou il ne parallelizes l'extérieur pour la boucle (donc il s'assure que, pour chaque thread parallèle avec l'indice de boucle i, sa boucle intérieure va être fait de manière séquentielle dans un seul thread, ce qui est très important).
Vous devez vous connecter pour publier un commentaire.
Les lignes que vous avez écrit, paralléliser seulement la boucle externe. Pour paralléliser les deux, vous devez ajouter un
collapse
clause:Vous voudrez peut-être vérifier OpenMP 3.1 spécifications de la sec (2.5.1) pour plus de détails.
Vous serez en mesure de mieux comprendre ce avec l'exemple suivant.
Nous allons faire cela avec deux threads.
alors le résultat sera,
Cela signifie que, lorsque vous ajoutez #pragma omp parallel pour la première boucle for, l'indice de la boucle for est divisé entre les threads. Comme vous pouvez le voir, lorsque l'indice de je en est de même de l'id de thread est aussi le même.
Au lieu de cela, nous pouvons en parallèle les combinaisons que nous avons imbriqués pour la boucle. Dans cet exemple, on peut avoir la suite des combinaisons de i et j.
Afin de paralléliser le code de sage, nous pouvons ajouter l'effondrement mot-clé comme suit.
alors le résultat sera comme suit.
Ensuite, vous pouvez voir que, contrairement à avant, pour le même indice i, il peut être de différents id de thread ( si i=1 et j=2 threadId=1) (i=1 et j=0 threadId=0)). Cela signifie que dans ce scénario, les combinaisons de i et j sont répartis entre les threads.
OpenMP seulement parallelizes la boucle à côté de la pragma. Vous pouvez paralléliser l'intérieur de la boucle aussi, si vous le souhaitez, mais cela ne se fera pas automatiquement.