Question

J'ai une application série que je parallélisé en utilisant OpenMP. J'ai simplement ajouté ce qui suit à ma boucle principale:

#pragma omp parallel for default(shared)
for (int i = 0; i < numberOfEmitters; ++i)
{
    computeTrajectoryParams* params = new computeTrajectoryParams;
            // defining params...
    outputs[i] = (int*) ComputeTrajectory(params);

    delete params;
}

Il semble bien fonctionner: au début, tous mes threads de travail exécutent une itération de la boucle, tout va vite, et j'ai une charge CPU à 100% (sur une machine quad-core). Cependant, après un moment, l'un des thread de travail arrête, et reste dans une fonction appelée _vcomp::PersistentThreadFunc de vcomp90.dll (le fichier est vctools\openmprt\src\ttpool.cpp), puis une autre, etc ... jusqu'à ce que le thread principal reste du travail.

Quelqu'un a une idée pourquoi cela se produit? Cela commence à se produire au bout d'environ la moitié des itérations ont été exécutées.

Était-ce utile?

La solution

Il peut dépendre du système de planification, et la taille de calcul dans chaque cycle. Si la programmation est statique - chaque thread est affecté au travail avant qu'il ne soit exécuté. Chaque thread obtenir un quart des indices. Il est possible que certains fils terminent avant les autres parce que leur travail est plus facile que celle des autres threads (ou peut-être qu'ils sont un peu moins chargé avec d'autres choses).

Essayez de travailler avec la programmation dynamique, et voir si cela fonctionne mieux.

Autres conseils

Petit commentaire sur votre code: Si votre temps d'exécution de ComputeTrajectory est mesurée en ms et vous avez plus de quelques itérations, vous devriez vraiment vous assurer que vous avez un allocateur de mémoire qui est MP optimisée, parce que vous allouez à chaque itération et ( encore aujourd'hui) la plupart des allocataires ont une piscine mondiale avec un verrou global.

Vous pouvez également examiner obtenir l'allocation de la boucle entièrement, mais il n'y a pas assez d'informations pour savoir s'il est possible ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top