Je cherche un moyen d’exécuter des sections de code en parallèle en utilisant plusieurs threads pour chaque section. Par exemple, si j’ai 16 threads et deux tâches, je souhaite que 8 threads exécutent simultanément ces deux tâches. OpenMP a plusieurs constructions ( section
, task
) qui exécutent le code général en parallèle, mais elles sont mono-threadées. Dans mon scénario, l’utilisation de la section
ou de la task
entraînerait l’exécution d’un processus par chacune des deux tâches, tandis que 14 processus restraient inactifs.
Est-ce que quelque chose comme ça est même possible avec OpenMP? Si oui, comment puis-je le faire et si non, que puis-je utiliser à cette fin?
Merci pour votre temps!
éditer 2:
Permettez-moi de développer cette question avec un exemple de code:
class some_class{ void task(){ cout<<"Entering the task method"<<endl; #pragma openmp parallel for for(int i=0; i < large_matrix.rows(); i++){ perform_thread_safe_operation(large_matrix.getRow(i)); } } matrix large_matrix; }; void main(){ //I have 16 cores, so I want to spawn 16 threads some_class o1; some_class o2; // I want 8 of the 16 threads to execute this line: o1.task(); // and 8 remaining threads to execute this line: o2.task(); }
Vous pouvez le faire en utilisant des régions parallèles nestedes.
omp_set_nested(1); #pragma omp parallel num_threads(2) { if (omp_get_thread_num() == 0){ #pragma omp parallel num_threads(8) { // Task 0 } }else{ #pragma omp parallel num_threads(8) { // Task 1 } } }
Alternativement, vous pouvez le faire comme ceci:
#pragma omp parallel num_threads(16) { if (omp_get_thread_num() < 8){ // Task 0 }else{ // Task 1 } }
Notez que ce code ne fonctionnera pas si OpenMP décide d’utiliser moins de 16 threads. Vous devrez pour cela insérer votre propre code de nettoyage.
EDIT: En réponse à votre mise à jour:
class some_class{ void task(){ cout<<"Entering the task method"<