Conseil OpenMP pour accélérer un calcul
Bonjour,
Je souhaiterais paralléliser une boucle for toute simple, habituellement je n'ai aucun problème et j'obtiens bien un facteur d'accélération proche du nombre de cores utilisés.
Cette fois-ci je bute sur un petit problème, mon code est plus lent en étant parallélisé, en rajoutant l'option reduction(+,mavar) j'ai les mêmes performances qu'en séquentiel.... J'ai essayé un ensemble d'options qui me paraissaient corhérentes, mais je n'obtiens jamais de meilleurs performances ...
Je viens à vous car je souhaterais un conseil de votre part pour que mon partage de calcul se fasse correctement avec le moi d'overhead possible.
Voici mon code d'origine :
nbrExamples = environ 14.000 dans mon cas
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
for(e = 0 ; e < nbrExamples ; e++)
{
//cout << "current thread : " << omp_get_thread_num() <<endl;
int h = 0;
//start at the root
const int response_one = *(featuresResponsesPtrOffset + e);
const int response_left = *(featuresResponsesPtrOffsetLeft + e);
const int response_right = *(featuresResponsesPtrOffsetRight +e);
// left
if(response_one < current->threshold)
{
if(current->left->alpha > 0)
{
if(response_left < current->left->threshold) { h = 1; }
else { h = -1; }
}
else
{
if(response_left >= current->left->threshold) { h = 1; }
else { h = -1; }
}
}
else
{
if(current->right->alpha > 0)
{
if(response_right < current->right->threshold) { h = 1; }
else { h = -1; }
}
else
{
if(response_right >= current->right->threshold) { h = 1; }
else { h = -1; }
}
}
ui[e] = (labels[e]) ? 1 * h : -1 * h;
r += weights[e]*ui[e];
} |
un simple #pragma parallel for fait ralentir considérablement l'éxecution,
un #pragma parallel for reduction(+:r) me ramène à des temps de calculs similaires à ce que j'obtiens en séquentiel (environ 12sec).
Pensez-vous que mon problème soit sous-dimensionné ? Je passe environ 12sec sur cette partie ...
Une observation cependant, pour l'option schedule(synamic, chunk), si chunk =1, mon temps de calcul passe à 90 secondes !
Merci !