condition sur point de départ d'itération de boucle
Bonjour.
J'ai un problème un peu compliqué. Grosso modo, je fais un traitement avec plusieurs thread. Tout d'abord voici mon code:
Code:
1 2 3 4 5 6 7 8 9 10
|
#pragma omp parallel num_threads(NUM_THREADS)
for(int i = ( omp_get_thread_num() == (NUM_THREADS - 1 )) ? (keys.size() - 1):(chunk*(omp_get_thread_num() + 1) - 1) ; i >= omp_get_thread_num()*chunk ; i--)
{
temp_sorted_keys.at(global_counting_vect.at(omp_get_thread_num() + NUM_THREADS*keys.at(i).at(h)) - 1) = keys.at(i);
global_counting_vect.at(omp_get_thread_num() + NUM_THREADS*keys.at(i).at(h))--;
}
//copy the values from temp_sorted_keys to keys
keys = temp_sorted_keys;
} |
Comme vous verrez le point de départ de la boucle fort est un peu compliqué. J'ai en entré un vector de charactères.
Je le découpe en plusieurs chunk. Chaque thread gérera un morceau.
Mais si le nombre d'éléments n'est pas un mutliple du nombre de thread, j'arrondi en définissant un chunk comme le ceil de la division. Bref:
Code:
1 2
|
chunk = ceil( keys.size() / NUM_THREADS); |
Retournons au problème. Ici chaque thread agit sur une partie (de taille chunk du tableau. Si le nombre d'entrée n'est pas un multiple, le dernier thread doit faire moins d'itérations car son chunk est plus petit.
Dans ma boucle, les threads sont obligés de commencer l'itération par l'élément à la fin de leur chunk.
Le problème est pour le dernier thread, son dernier élément ne se situe pas à la fin "théorique" de son chunk. C'est à dire que je ne peux pas mettre en point de départ:
Code:
1 2
|
(chunk*(omp_get_thread_num() + 1) - 1) |
(le -1 est parce que les tableaux en C++ sont indexé à partir de 0.
Bref, du coup j'ai:
Code:
1 2
|
( omp_get_thread_num() == (NUM_THREADS - 1 )) ? (keys.size() - 1):(chunk*(omp_get_thread_num() + 1) - 1) |
comme point de départ. C'est à dire, si t'es le dernier thread, commence par keys.size() - 1 sinon par la fin de ton chunk...
Bref, mon code fonctionne, je change le nombre de threads, et ça marche même quand l'entrée n'est pas un multiple.
Mais voila, ça ne marche pas tout le temps pour une raison que je ne comprends pas... Auriez-vous une idée d'où cela pourrait provenir?
ps: pour pas trop polluer, j'ai pas mis tout mon code. Si vous en avez besoin dites le moi...