2011-10-24 9 views
5

tengo una CPU función do_long que necesito para funcionar en dos conjuntos de datos diferentes que consume.OpenMP: ejecutar dos funciones en paralelo, cada uno por medio de grupo de subprocesos

do_long(data1); 
do_long(data2); 

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

Tengo N subprocesos disponibles (depende de la máquina). Cómo saber OpenMP que quiero que ambos do_long funciones se ejecutan en paralelo, y N/2 hilos debe realizar el bucle en el primer do_long y otro N/2 debe procesar segundo do_long?

Respuesta

5

Un enfoque consiste en hacerlo utilizando el paralelismo anidado:

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; 
} 
Cuestiones relacionadas