Cláusula Default
Anterior | Siguiente |
Para evitar suposiciones respecto a si una variable es privada o compartida, es recomendable utilizar la cláusula default, la cual ofrece dos posibilidades:
- shared: se asume que todas las variables definidas antes de la región paralela son compartidas, a menos que explícitamente se especifique otro calificativo.
- none: no se asume ningún calificativo, y toda variable referenciada debe ser explícitamente cualificada.
Sintaxis básica
#pragma omp parallel default(shared|none)
{
<parallel region code>
}
Ejemplo 1
Dentro de la región paralela compararemos una variable compartida y una privada, solo con c
explícitamente tipificada, para determinar cuál es el hilo maestro:
#include <stdio.h>
#include <omp.h>
int main(){
int t = -1;
int m = omp_get_thread_num();
printf("master thread=%d in serial region\n", m);
#pragma omp parallel default(shared) private(t)
{
t = omp_get_thread_num();
if(t==m)
printf("master thread=%d in parallel region\n", m);
else
printf("thread=%d in parallel region\n", t);
}
printf("master thread=%d in serial region\n", m);
printf("value of t=%d\n", t);
}
¿Cómo compilar?
clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/
-o default-000 default-000.c
¿Cómo ejecutar?
./default-000
Salida
master thread=0 in serial region
thread=2 in parallel region
master thread=0 in parallel region
thread=1 in parallel region
thread=3 in parallel region
master thread=0 in serial region
value of t=-1
t
conserva su valor original una vez termina la región paralela.
Ejemplo 2
Dentro de la región paralela compararemos una variable compartida y una privada, ambas explícitamente tipificada, para determinar cuál es el hilo maestro:
#include <stdio.h>
#include <omp.h>
int main(){
int t = -1;
int m = omp_get_thread_num();
printf("master thread=%d in serial region\n", m);
#pragma omp parallel default(none) shared(m) private(t)
{
t = omp_get_thread_num();
if(t==m)
printf("master thread=%d in parallel region\n", m);
else
printf("thread=%d in parallel region\n", t);
}
printf("master thread=%d in serial region\n", m);
printf("value of t=%d\n", t);
}
¿Cómo compilar?
clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/
-o default-001 default-001.c
¿Cómo ejecutar?
./default-001
Salida
master thread=0 in serial region
master thread=0 in parallel region
thread=2 in parallel region
thread=3 in parallel region
thread=1 in parallel region
master thread=0 in serial region
value of t=-1
t
conserva su valor original una vez termina la región paralela.
Preguntas
- Elimina las cláusulas shared y private en ambos ejemplos.
- ¿Qué sucede?
- ¿Cuáles serían las ventajas de usar default(none)?
Anterior | Siguiente |
Estás en el Nivel 1: Introducción a la programación paralela con OpenMP. ¿Deseas volver al inicio?