OpenMP. Qué es OpenMP?

Documentos relacionados
TEMA 5: PARALELISMO A NIVEL DE HILOS, TAREAS Y PETICIONES (TLP, RLP) (primera parte).

Programación paralela con OpenMP

Multiprocesamiento en lenguaje C Introducción a Open Multiprocessing (OpenMP)

Programación en Memoria Compartida: OpenMP

1 Primitivas básicas de OpenMP

Programación Paralela en OpenMp

Programación Multihebra con OpenMP. José Miguel Mantas Ruiz Depto. de Lenguajes y Sistemas Informáticos Universidad de Granada

Sistemas Complejos en Máquinas Paralelas

Introducción a la Programación de Memoria Compartida.. con OpenMP

Paralelización de Programas Secuenciales: OpenMP

Cómputo paralelo con openmp y C

Guía práctica de estudio 11 Introducción a OpenMP.

Adolfo J. Banchio. FaMAF, IFEG-CONICET, Universidad Nacional de Córdoba Seminario de grupo 1

Laboratorio de Paralelismo OpenMP: ejemplos y ejercicios

CLUSTER FING: ARQUITECTURA Y APLICACIONES

Programación de Memoria Compartida - OpenMP

Cómputo en paralelo con OpenMP 1

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GRADO EN ING. INFORMÁTICA. ING. COMPUTADORES PRÁCTICA 8: INTRODUCCIÓN A OPENMP.

2º curso / 2º cuatr. Arquitectura de Computadores. Grado en Ing. Informática. Seminario 1. Herramientas de programación paralela I: Directivas OpenMP

TEMA 2: PROGRAMACIÓN PARALELA (I)

Soluciones a ejercicios de paralelismo y concurrencia

Multiplicación de matrices dispersas

Master SIA 2012/13. Programación de Sistemas Paralelos. OpenMP: Ejercicios prácticos. Facultad de Informática. Ejercicio 1.A. pi.c

Esquemas algorítmicos paralelos - Particionado y Paralelismo de Datos

Esquemas algorítmicos paralelos - Particionado y Paralelismo de Datos

Taller de Programación Paralela

Paralelización especulativa

Programación Multihilo

Programación en Memoria Compartida: OpenMP

Redes para Clusters. Redes para Clusters. Redes Ethernet. Myrinet InfiniBand. Ethernet Fast Ethernet Gigabit Ethernet

Arquitectura de Computadores: Exámenes y Controles

Programación con OpenMP

Laboratorio de Paralelismo

Programación en Intel Xeon Phi

Computación Matricial y Paralela

PROGRAMACIÓN PARALELA. Modelos de programación paralela Paradigmas de programación paralela

Paralelismo Relajado Paralelismo Síncrono

METODOLOGÍA DE LA PROGRAMACIÓN PARALELA. Modelos de programación paralela Paradigmas de programación paralela

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Programación sobre sistemas de memoria compartida: programación con OpenMP

INTRODUCCIÓN A LA POO EN C++

FUNDAMENTOS PARA LA CONSTRUCCIÓN DEL CÓDIGO A PARTIR DEL ALGORITMO

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA INGENIERÍA EN INFORMÁTICA. ARQUITECTURA DE COMPUTADORES II 10 junio de 2006

Estructuras de control selectivas

Tema 3. Estructuras de control

Procesadores de lenguaje Tema 8 Generación de código y optimización

Concurrencia y Paralelismo

Arquitecturas Paralelas Multiprocesadores

Paralelización de problemas de recorrido de árboles Trabajadores replicados y esquema maestro esclavo

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Lenguaje de Programación: C++ Directivas al preprocesador

CUDA: MODELO DE PROGRAMACIÓN

Modelos de programación paralela y concurrente

Procesamiento paralelo con hilos de Java

CUDA (Compute Unified Device Architecture)

Descripción de un Programa

Heterogénea y Jerárquica

Programación orientada a objetos II

Examen de Fundamentos de la Programación (Modelo 1)

Tema 18: Memoria dinámica y su uso en C

IMPLEMENTACIÓN DE COMPUTACIÓN DE ALTO RENDIMIENTO Y PROGRAMACIÓN PARALELA EN CÓDIGOS COMPUTACIONALES CARLOS ANDRÉS ACOSTA BERLINGHIERI

Programación 1 Tema 2. Lenguaje de programación y ejecución de un programa

CUDA 5.5 y Visual Studio Express 2012 para Escritorio. Primeros pasos.

2º curso / 2º cuatr. Arquitectura de Computadores. Grado en Ing. Informática. Seminario 0. Entorno de programación: atcgrid y gestor TORQUE

SISTEMAS PARALELOS PROGRAMA ANALÍTICO. Unidad 1: Conceptos básicos Paralelismo. Objetivos del procesamiento paralelo.

TEMA 1. FUNDAMENTOS DE LA CONCURRENCIA

Transcripción:

OpenMP Qué es OpenMP? Modelo de programación paralela Paralelismo de memoria compartida Soporta el paralelismo por datos Escalable Permite paralelización incremental Extensiones a lenguajes de programación existentes ( Fortran, C, C++) 1

Shared Memory Systems (cont) OpenMP Pthreads Distributed Memory Systems Processor Processor Processor M M M MPI HPF Interconnect 2

Clustered of SMPs MPI hybrid MPI + OpenMP Sintaxis de OpenMP La mayoria de las construcciones en OpenMP son directivas de compilación o pragmas. En C y C++, los pragmas tienen la forma: #pragma omp construct [clause [clause] ] En Fortran, las directivas tienen la forma: C$OMP construct [clause [clause] ]!$OMP construct [clause [clause] ] *$OMP construct [clause [clause] ] Como las construcciones son directivas, un programa en OpenMP puede ser compilado por compiladores que no soportan OpenMP. 3

Programa sencillo La mayoría de las construcciones son directivas de compilación o pragmas La parte central de OpenMP es la paralelización de lazos Programa Secuencial void main() { double a[1000],b[1000],c[1000]; for (int i = 0; i< 1000; i++){ a[i] = b[ii] + c[i]; Programa Paralelo void main() { double a[1000],b[1000],c[1000]; for for (int i = 0; i< 1000; i++){ a[i] = b[ii] + c[i]; Modelo de programación en OpenMP 4

Cómo interactuan los threads? OpenMP es un modelo de memoria compartida. Los threads se comunican utilizando variables compartidas. El uso inadecuado de variables compartidas origina carreras críticas: Para controlar las carreras críticas: Uso de sincronización para protegerse de los conflictos de datos. La sincronización es costosa: Modificar cómo se almacenan los datos para minimizar la necesidad de sincronización. Alcance de los Datos SHARED La variable es compartida por todos los procesos PRIVATE Cada proceso tiene una copia de la variable for shared(a,b,c,n) private(i) for (i = 0; i < n; i++) { a(i) = b(i) + c(i); 5

Alcance de los Datos Ejemplo for shared(a,b,c,n) private(i,temp) for (i = 0; i < n; i++) { temp = a[i] / b[i]; c[i] = temp + temp * temp; FIRSTPRIVATE / LASTPRIVATE FIRSTPRIVATE Las copias privadas de las variables se inicializan con los objetos originales LASTPRIVATE Al salir de una región privada o lazo, la variable tiene el valor que tendría en caso de una ejecución secuencial A = 2.0 for FIRSTPRIVATE(A) LASTPRIVATE(i) for (i = 0; i < n; i++) { Z[i] = A * X[i] + Y[i]; 6

Variables REDUCTION Son variables que se utilizan en operaciones colectivas sobre elementos de un array ASUM = 0.0; APROD = 1.0; for REDUCTION(+:ASUM) for (i = 0; i < n; i++) { ASUM = ASUM + A[i]; APROD = APROD * A[i]; Ejemplo INTEGER x(3), y(3), z!$omp PARALLEL DO DEFAULT (PRIVATE), SHARED(x), &!$OMP REDUCTION(+:z) DO k = 1, 3 x(k) = k y(k) = k*k z = z + x(k) * y(k) END DO!$OMP END PARALLEL DO 7

Regiones Paralelas { /* Código a ser ejecutado por cada thread */ Código paralelo i = 0 foo(i, ) foo(i, ) foo(i, ) foo(i, ) printf( %d\n, i) i = 0; { foo(i,a,b,c) #pragma omp end parallel printf( %d\n, i); Regiones Paralelas i = 0 foo(0, ) foo(1, ) foo(2, ) foo(3, ) printf( %d\n, i) i = 0; omp_set_num_threads(4); { i = omp_thread_num(); foo(i,a,b,c); #pragma omp end parallel printf( %d\n, i); 8

OpenMP runtime library OMP_GET_NUM_THREADS() regresa el número actual de threads OMP_GET_THREAD_NUM() regresa el identificador de ese thread OMP_SET_NUM_THREADS(n) indica el número de threads etc 9

Directiva MASTER La construcción master delimita un bloque estructurado que solo es ejecutado por el thread maestro. Los otros threads no lo ejecutan. private (tmp) { acciones(); #pragma omp master { acciones_maestro(); #pragma barrier acciones(); Código secuencial Compartir Trabajo Motivación for(i=0;i<n;i++) {a[i] = a[i] + b[i]; Región paralela OpenMP Región paralela y constructor para compartir Trabajo en OpenMP { int id, i, Nthreads, istart, iend; id = omp_get_thread_num(i); Nthreads = omp_get_num_threads(); istart = id * N / Nthreads; iend = (id + 1) * N / Nthreads; for(i=istart;i<iend;i++) {a[i]=a[i]+b[i]; #pragma omp for schedule(static) for(i=0;i<n;i++) {a[i] = a[i] + b[i]; 10

Planificación de Tareas SCHEDULE Direrentes formas de asignar iteraciones a threads schedule(static [,chunk]) chunk iteraciones se asignan de manera estática a los threads en round-robin schedule (dynamic [,chunk]) Cada thread toma chunk iteraciones cada vez que está sin trabajo schedule (guided [,chunk]) Cada thread toma iteraciones dinámicamente y progresivamente va tomando menos iteraciones. 11

Exclusión Mutua Sección Crítica shared(x,y) #pragma omp critical (section1) actualiza(x); #pragma omp end critical(section1) #pragma omp critical(section2) actualiza(y); #pragma omp end critical(section2) #pragma omp end parallel 12

Barreras Los threads se detienen hasta que todos alcancen la barrera Sintaxis #pragma omp barrier Ejemplo #pragma omp for for(i=0;i<n;i++) { <acciones> #pragma omp barrier <acciones> Cálculo de PI Secuencial static long num_steps = 100000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; 13

Versión en OpenMP #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 void main () { int i; double x, pi, sum[num_threads]; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads); { double x; int id; id = omp_get_thread_num(); for (i=id, sum[id]=0.0;i< num_steps; i=i+num_threads){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); for(i=0, pi=0.0;i<num_threads;i++) pi += sum[i] * step; OpenMP PI Program: Work Sharing Construct #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 void main () { int i; double x, pi, sum[num_threads]; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads) { double x; int id; id = omp_get_thread_num(); sum[id] = 0; #pragma omp for for (i=id;i< num_steps; i++){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); for(i=0, pi=0.0;i<num_threads;i++)pi += sum[i] * step; 14

Versión de PI que utiliza REDUCTION #include <omp.h> static long num_steps = 100000; double step; #define NUM_THREADS 2 void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; omp_set_num_threads(num_threads); for reduction(+:sum) private(x) for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); pi = step * sum; References OpenMP Official Website: www.openmp.org OpenMP 2.5 Specifications An OpenMP book Rohit Chandra, Parallel Programming in OpenMP. Morgan Kaufmann Publishers. Compunity The community of OpenMP researchers and developers in academia and industry http://www.compunity.org/ Conference papers: WOMPAT, EWOMP, WOMPEI, IWOMP http://www.nic.uoregon.edu/iwomp2005/index.html#program 15