1. Indice de pagina
  2. 1. Objetivos
  3. 2. Explicación
  4. 2.1. Código Inicio
  5. 2.2. Ejercicios propuestos
  6. 2.3. Funciones necesarias
  7. 3. Solución
  8. 3.1. Apartado A
  9. 3.2. Apartado B
  10. 3.3. Apartado C
  11. 3.4. Código
  12. 3.5. Salida

Hello World

Objetivos

Explicación

Vamos a comenzar este tutorial aprendiendo a usar lo mas básico de OpenMP. OpenMP usa la directiva #pragma omp parallel para indicar en comienzo de una sección de código donde al comienzo se crearan N hebras se ejecuta paralelamente por las distintas hebras y al final se destruyen las hebras creadas prosiguiendo la ejecución secuencial.

Representación de la creación de hebras con la directiva pragma omp parallel

Código Inicio Descarga

A continuación tenemos un ejemplo del programa Hola Mundo.

#include <omp.h>
#include <iostream>
 
int main (){
 
int nthreads;
int thread;
 
#pragma omp parallel private(nthreads, thread)
  {
 
  thread = omp_get_thread_num();
 
  nthreads = omp_get_num_threads();
 
  std::cout<<"Hola Mundo soy la hebra ="<< thread <<" de "<<nthreads<<" que
somos"<<std::endl;
 
  }
 
}

La clausula private que acompaña a la directiva #pragma omp parallel indica que las hebras creadas tendrán copias locales de estas.

> g++ -fopenmp 01.cpp -o holaMundo
> ./holaMundo
Hola Mundo soy la hebra =1 de 2 que somos
Hola Mundo soy la hebra =0 de 2 que somos

Como puedes ver en la salida del programa se han ejecutado dos hebras. Por defecto OpenMP lanzara tantas hebras como núcleos de procesamiento tenga la maquina donde se ejecuta.

Ejercicios propuestos

Ahora toca experimentar:

Funciones necesarias

Solución

Apartado A

Añadiendo la función omp_set_num_threads(10); antes de la region paralela conseguiremos que OpenMP lance el numero especificado de hebras.

Apartado B

Para OpenMP las variables no privadas son compartidas aunque siempre es mas claro indicar las variables compartidas mediante shared.

Apartado C

Con la clausula private se reserva espacio para almacenar la variable localmente pero no se inicializa si queremos que se inicialice debemos usar fistprivate(NuevoValor).

Código Descarga

#include <omp.h>
#include <iostream>
 
int main (){
 
int nthreads;
int thread;
int NuevoValor = 222;
 
omp_set_num_threads(10);
#pragma omp parallel private(nthreads, thread) firstprivate(NuevoValor)
  {
 
  thread = omp_get_thread_num();
 
  nthreads = omp_get_num_threads();
 
  std::cout<<"Hola Mundo soy la hebra ="<< thread <<" de "<<nthreads<<" que somos"<< " Esta
es la variable nueva = "<<NuevoValor<<std::endl;
 
  }
 
}

Salida

La salida no tiene porque salir ordenada.

> g++ -fopenmp 01.cpp -o holamundo
> ./holamundo
Hola Mundo soy la hebra =0 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =1 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =2 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =5 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =6 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =7 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =8 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =3 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =4 de 10 que somos Esta es la variable nueva = 222
Hola Mundo soy la hebra =9 de 10 que somos Esta es la variable nueva = 222
Creado por: Daniel Guerrero Martínez y Sergio Rodríguez Lumley 2010

Valid HTML 4.01 Transitional