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.
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.
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.
Ahora toca experimentar:
Añadiendo la función omp_set_num_threads(10); antes de la region paralela conseguiremos que OpenMP lance el numero especificado de hebras.
Para OpenMP las variables no privadas son compartidas aunque siempre es mas claro indicar las variables compartidas mediante shared.
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).
#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; } }
La salida no tiene porque salir ordenada.