2012-05-04 15 views
8

es una barrera omp implícita después de omp sección críticahay ¿Hay una barrera implícita después de omp sección crítica

Por ejemplo, ¿Puedo modificar esta siguiente versión-1 código en versión-2.

VERSIÓN-1

int min = 100; 
#pragma omp parallel 
{ 
    int localmin = min; 

    #pragma omp for schedule(static) 
    for(int i = 0; i < 1000; i++) 
     localmin = std::min(localmin, arr[i]); 

    #pragma omp critical 
    { 
     min = std::min(localmin, min) 
    } 
} 

VERSION-2

int min = 100; 
#pragma omp parallel 
{ 
    int localmin = min; 

    #pragma omp for schedule(static) nowait 
    for(int i = 0; i < 1000; i++) 
     localmin = std::min(localmin, arr[i]); 

    #pragma omp critical 
    { 
     min = std::min(localmin, min) 
    } 
} // will I get the right "min" after this (because I have included nowait) 

Voy a recibir el mismo resultado, tanto para la versión 1 y versión-2?

¿Existe una barrera implícita después de la región crítica omp?

EDIT: Lo siento si el ejemplo es muy pobre .. También, me gustaría saber si habría alguna diferencia de rendimiento entre versión 1 y versión 2-

+0

Probablemente no sea el mejor ejemplo, ya que habrá una barrera cuando salga de la región paralela. Pero una buena pregunta, no obstante. +1 – Mysticial

+0

No hay beneficio de rendimiento en v2 sobre v1 en el ejemplo artificial que publicaste, pero en el mundo real, podría haberlo. –

Respuesta

11

Las secciones críticas no tienen barreras , ni en sus comienzos ni en sus fines. Una sección crítica es una construcción de sincronización automática que impide que varios subprocesos accedan a los mismos datos al mismo tiempo. Necesita una barrera adicional después de la sección crítica si desea tener el mínimo global correcto antes de salir de la región paralela. Como ya se dijo, la región paralela tiene una barrera implícita al final.

0

Obtendrá un beneficio de rendimiento al usar nowait si hay una gran cantidad de iteraciones.

Cuestiones relacionadas