2011-11-08 4 views
0

J'ai un morceau de codecode OpenMP Attend Rejoignez Barrière la plupart du temps

void parallel_func() 
{ 
#pragma omp parallel 
    { 
    #pragma omp for collapse(2) schedule(dynamic) nowait 
    for(i=0; i<N; i++) { 
     for(j=0;j<N;j++) { 
      if (i>j) continue; // hack to allow collapse here 
     //... 
     } 
    } 

    #pragma omp critical 
    { 
    //... 
    } 
    } 
} 

l'aide d'un profileur, je remarque que la plupart du temps mon code passe ... en attente sur OpenMP Rejoignez Barrière ... Une idée pourquoi? Ou comment identifier la cause?

~

Répondre

1
  1. Où est omp parallel? Je suppose que parallel_func est à l'intérieur d'une section omp parallel.

  2. Il n'est pas clair puisque vous n'avez pas dit quelle barrière de jointure a provoqué une énorme surcharge. Dans votre code, omp for a nowait, ce qui signifie pas de barrière implicite. Vous avez omp critical. C'est littéralement une section critique, donc cela ne fera pas d'opérations de barrière. (Si omp single, puis une jointure barrière est nécessaire à moins que omp single nowait.

  3. Ainsi, le seul endroit Susceptible de se joindre à barrière est de la section omp parallel, qui ne figure pas dans votre code. Si la fin de parallel_func est la fin de la section omp parallel, et votre omp parallel n'a pas nowait, la jointure barrière est de la fin de la parallel_func.

  4. Enfin, comment identifier la cause? Il est surtout à cause du déséquilibre de la charge de travail. la quantité de travail chaque thread peut être trop fortement dévié, ce qui fait que certains threads perdent leur temps sur la barrière de jointure implicite. ase identifier la répartition de la charge de travail.

+0

merci pour la réponse. J'ai ajouté 'parallel'. J'ai utilisé VTune et j'ai remarqué que tous les threads sont inactifs à la fin, donc c'est bizarre. J'ai également effacé presque tout le code, et j'ai eu le même effet. Peut-être que c'est un artefact ajouté par VTune ... –

Questions connexes