Anterior Siguiente

Al volver de un bucle compartido por los hilos, a veces se requiere obtener el valor de una variable en la última iteración del bucle. Esto se logra adicionando la cláusula lastprivate a la directiva paralela.

Sintaxis básica

#pragma omp parallel for lastprivate(<var1[,var2,var3]>)
for(...){
    <loop body>
}// implicit barrier here

Ejemplo

Vamos a modificar la variable p dentro del bucle y obtener su valor en la última iteración:

#include <stdio.h>
#include <omp.h>

int main(){
    int m = omp_get_thread_num();
    printf("master thread=%d in serial region\n", m);
    
    int p = -1;
    printf("p=%d in serial region\n", p);

    #pragma omp parallel for lastprivate(p)
    for(int i=0; i<16 ; i++){
        int f = omp_get_thread_num();
        p = f;
        printf("p=%d modified by thread=%d\n", p, f);
    } // implicit barrier here
    
    printf("master thread=%d in serial region\n", m);
    printf("p=%d in serial region\n", p);
}

Descarga el código aquí.

¿Cómo compilar?

clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/ 
     -o lastprivate-000 lastprivate-000.c

¿Cómo ejecutar?

./lastprivate-000 

Salida

p=-1 in serial region
p=0 modified by thread=0
p=0 modified by thread=0
p=0 modified by thread=0
p=0 modified by thread=0
p=3 modified by thread=3
p=3 modified by thread=3
p=3 modified by thread=3
p=3 modified by thread=3
p=1 modified by thread=1
p=1 modified by thread=1
p=1 modified by thread=1
p=1 modified by thread=1
p=2 modified by thread=2
p=2 modified by thread=2
p=2 modified by thread=2
p=2 modified by thread=2
master thread=0 in serial region
p=3 in serial region

Cada hilo recibe una contiene una copia de la variable p y le hace modificaciones . Al terminar el bucle, como la última iteración estuvo a cargo del hilo 3, la variable p tiene como valor 3.

Preguntas

  • Separa el parallel del for y utiliza lastprivate en la clásula parallel.
  • ¿Qué sucede?
Anterior Siguiente
Estás en el Nivel 2: Bucles paralelos y tareas concurrentes con OpenMP. ¿Deseas volver al inicio?