Une fois tes threads lancés, tu peux lancer un traitement en parallèle en appelant sem_post(&truc_a_traiter); pour chaque thread que tu veux débloquer (attention, c'est fait à l'arrache, il y a des races conditions).
Après, cette solution ressemble à ce que fait l'implémentation OpenMP, donc je pense qu'il vaut mieux laisser OpenMP gérer ce genre de cas. L'utilisation de pthreads n'apportera pas grand chose à moins de fixer les threads sur les cores qui vont bien, ce qu'OpenMP ne sait pas forcement faire.
[^] # Re: creation des threads + cache
Posté par François Trahay . En réponse au message Parallelisation d'une boucle (théoriquement) trivialement parallélisable. Évalué à 2.
Oui, il suffit de ne pas les tuer :) Par exemple, au lieu de faire:
pthread_create( &(threads[i]), NULL, predictInPlace, (void*) (&dataThreads[i]));
tu peux exécuter une fonction qui attend du travail :
pthread_create( &(threads[i]), NULL, traiter_un_job, (void*) (&dataThreads[i]));
void traiter_un_job(void* ptr) {
while(1) {
sem_wait(&truc_a_traiter);
predicInPlace(ptr);
sem_post(&traitement_terminee);
}
}
Une fois tes threads lancés, tu peux lancer un traitement en parallèle en appelant
sem_post(&truc_a_traiter);pour chaque thread que tu veux débloquer (attention, c'est fait à l'arrache, il y a des races conditions).Après, cette solution ressemble à ce que fait l'implémentation OpenMP, donc je pense qu'il vaut mieux laisser OpenMP gérer ce genre de cas. L'utilisation de pthreads n'apportera pas grand chose à moins de fixer les threads sur les cores qui vont bien, ce qu'OpenMP ne sait pas forcement faire.