2011-10-24 19 views
5

Ho una CPU che consuma la funzione do_long che devo eseguire su due set di dati diversi.OpenMP: esegue due funzioni in parallelo, ciascuna metà del pool di thread

do_long(data1); 
do_long(data2); 

do_long() { 
#pragma omp for 
    for(...) { 
     // do proccessing 
    } 
} 

I thread N disponibili (dipende dalla macchina). Come dire a OpenMP che voglio che entrambe le funzioni do_long vengano eseguite in parallelo, e N/2 discussioni dovrebbero eseguire il ciclo in primo do_long e un altro N/2 dovrebbe elaborare secondo do_long?

risposta

5

Un approccio è quello di farlo utilizzando il parallelismo annidato:

void do_long(int threads) { 
#pragma omp parallel for num_threads(threads) 
    for(...) { 
     // do proccessing 
    } 
} 


int main(){ 
    omp_set_nested(1); 

    int threads = 8; 
    int sub_threads = (threads + 1)/2; 

#pragma omp parallel num_threads(2) 
    { 
     int i = omp_get_thread_num(); 

     if (i == 0){ 
      do_long(data1, sub_threads); 
     } 
     if (i == 1 || omp_get_num_threads() != 2){ 
      do_long(data2, sub_threads); 
     } 
    } 

    return 0; 
} 
Problemi correlati