Anterior Siguiente

Al compartir el trabajo, a veces se requiere que todos los hilos reciban una copia de una variable inicializada con el mismo valor, principalmente si se piensa hacer cambios sobre esa variable. Esto se logra adicionando la cláusula firstprivate a la directiva paralela.

Sintaxis básica

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

Ejemplo

Vamos a modificar la variable p dentro del bucle:

#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 = 4;
    printf("p=%d in serial region\n", p);

    #pragma omp parallel for firstprivate(p)
    for(int i=0; i<16 ; i++){
        int f = omp_get_thread_num();
        p = 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 firstprivate-000 firstprivate-000.c

¿Cómo ejecutar?

./firstprivate-000 

Salida

master thread=0 in serial region
p=4 in serial region
p=6 modified by thread=2
p=8 modified by thread=2
p=10 modified by thread=2
p=12 modified by thread=2
p=5 modified by thread=1
p=4 modified by thread=0
p=4 modified by thread=0
p=4 modified by thread=0
p=4 modified by thread=0
p=6 modified by thread=1
p=7 modified by thread=1
p=8 modified by thread=1
p=7 modified by thread=3
p=10 modified by thread=3
p=13 modified by thread=3
p=16 modified by thread=3
master thread=0 in serial region
p=4 in serial region

Cada hilo recibe una copia de la variable p inicializada en 4 y le hace modificaciones . Sin embargo, al terminar el bucle, la variable p mantiene su valor original.

Preguntas

  • Modifica el programa y utiliza la cláusula shared en lugar de firstprivate.
  • ¿Qué puede suceder?
Anterior Siguiente
Estás en el Nivel 2: Bucles paralelos y tareas concurrentes con OpenMP. ¿Deseas volver al inicio?