Openmp
Upcoming SlideShare
Loading in...5
×
 

Openmp

on

  • 1,245 views

OpenMP

OpenMP

Statistics

Views

Total Views
1,245
Views on SlideShare
1,245
Embed Views
0

Actions

Likes
1
Downloads
12
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Openmp Openmp Presentation Transcript

  • OpenMP José Casero Cantos www.twitter.com/Jose_Casero
  • Introducción
    • API para programación multiproceso en máquinas con memoria compartida.
    • Modelo de programación portable y escalable.
    • Modelo de ejecución basado en fork-join.
  • Architecture Review Board
  • Historia
    • OpenMP 1.0 (1997-1998)
    • OpenMP 2.0 (2000-2002)
    • OpenMP 2.5 (2005)
    • OpenMP 3.0 (2008)
    • OpenMP 3.1 (2011)
  • Elementos básicos Sintaxis básica #pragma omp nombre-directiva [cláusulas]
  • Estructuras Paralelas de Control Con Bucle #pragma omp parallel for for ( i = ilo; i <= ihi; i++ ) { Código C/C++ } Sin Bucle #pragma omp parallel { t_id = omp_get_thread_num ( ); if ( t_id % 2 == 0 ) { solid_update ( ); } else { Liquid_update ( ); } }
  • Work Sharing
    • Omp for or omp do: Usado para dividir iteraciones de bucles entre varios hilos. También es llamado constructor de bucle.
    • Sections: Asignación de bloques consecutivos pero independientes a diferentes hilos
    • Single: Especifica un bloque de código que es ejecutado solamente por una hebra. Barrera implícita en el final
    • Master: similar a single pero el bloque de código será ejecutado solo por la hebra principal y no existirá una barrera implícita al final.
  • Data Environment
    • Shared: los datos dentro de una región paralela son compartidos, lo cual significa que son visibles y accesibles desde otras hebras simultáneamente Por defecto todas las variables son compartidas excepto las utilizadas en bucles.
    • Private: los datos contenidos en una región paralela son exclusivamente accedidos por la hebra que lo esté ejecutando.
    • Default: permite al programador especificar el comportamiento de las variables sin ámbito de una región paralela. Podrán ser compartidos o no.
    • Firstprivate: como private excepto la inicialización del valor es actualizada antes de la construcción.
    • Lastprivate: como private excepto que el valor original es actualizado después de la construcción.
    • Reduction: un camino seguro para reunir todo el trabajo de todas las hebras.
  • Synchronization
    • Critical section: el código que se encuentre en sección crítica será ejecutado solo por una hebra al mismo tiempo.
    • Atomic: similar a la anterior, pero avisa al compilador para un uso especial y mejorar el rendimiento.
    • Ordered: el bloque estructurado es ejecutado en el orden en el cual las iteraciones podrían ser ejecutadas en un bucle secuencial.
    • Barrier: cada subproceso espera a que todos los otros hilos de un equipo hayan llegado a este punto.
    • Nowait: especifica que cada hebra complete su trabajo asignado sin esperar a que finalicen las demás hebras.
  • Runtime Variables
    • OMP_SCHEDULE
    • OMP_NUM_THREADS
    • OMP_NESTED
    • OMP_DYNAMIC
  • Runtime Functions
    • omp_get_max_threads
    • omp_get_num_threads
    • omp_get_thread_num
    • omp_init_lock
    • omp_unset_lock
  • ¿Por dónde empiezo? Procesador de texto (Gedit, Kate, Emacs, …) GCC (Compilador) g++ -fopenmp HelloWorld.cpp -o HelloWorld
  • Entorno de Desarrollo Integrado
  • ¡Hola Mundo! #include <omp.h> #include <iostream> #include <sstream> int main (int argc, char *argv[]) { int th_id, nthreads; #pragma omp parallel private(th_id) { th_id = omp_get_thread_num(); std::ostringstream ss; ss << &quot;Hello World from thread &quot; << th_id << std::endl; std::cout << ss.str(); #pragma omp barrier #pragma omp master { nthreads = omp_get_num_threads(); std::cout << &quot;There are &quot; << nthreads << &quot; threads&quot; << std::endl; } } return 0; }
  • Vídeo
  • Depuración TotalView (Etnus) PGDBG Graphical Symbolic Debugger GDB
  • Pros
    • No utiliza el paso de mensajes como MPI.
    • Los datos y la descomposición en hebras las maneja OpenMP de forma automática.
    • Paralelismo incremental: puede trabajar en una porción de tiempo al mismo tiempo sin realizar un cambio exagerado en el código.
    • Código unificado para aplicaciones secuenciales y en paralelo.
    • Los constructores OpenMP son tratados como comentarios cuando se usa una compliación en secuencial.
    • Se reducen menos bugs al hacer menos cambios en el código con motivo de lo anteriormente mencionado.
    • Granularidad gruesa y granularidad fina son posibles con OpenMP.
    • Existe abundante información en internet.
  • Contras
    • Difícil depuración de errores.
    • Actualmente, solo funciona eficientemente en plataformas de multiprocesadores con memoria compartida.
    • La escalabilidad está limitada por la memoria de la arquitectura.
    • No soporta comparte-and-swap.
    • No puede utilizase en GPU.
    • La documentación que realmente ha sido de provecho se encuentra en inglés.
  • Si os ha interesado... Presentación: http://www.slideshare.net/JoseCasero/openmp Video: http://www.youtube.com/watch?v=eHdQ0Ck4Bds
  • Fuentes Http://www.openmp.org/ http://en.wikipedia.org/wiki/OpenMP http://es.wikipedia.org/wiki/OpenMP http://alvaromamanialiaga.blogspot.com/2010/09/granularidad-en-sistemas-distribuidos.html