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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...