Programación Paralela en...

Post on 19-Sep-2018

218 views 0 download

Transcript of Programación Paralela en...

Programación Paralela en

OpenMp

Proyecto PAPIME PE104911

Facultad de Ingeniería

Universidad Nacional Autónoma de México

Elba Karen Sáenz García- Oscar René Valdez

Casillas1

• Utilidad de realizar procesamiento paralelo en

computadoras con arquitectura de memoria

compartida que permitan la ejecución

simultanea de varios hilos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas2

Memoria compartida

• En el hardware de una computadora , la

memoria compartida se refiere a un bloque de

memoria de acceso aleatorio a la que se

puede acceder por varias unidades de

procesamiento diferentes.

Elba Karen Sáenz García- Oscar René Valdez

Casillas3

Memoria Compartida

En software, la memoria compartida

• Es un método de comunicación entre

procesos/hilos, es decir, una manera de

intercambiar datos entre programas que se

ejecutan al mismo tiempo. Un proceso creará

un espacio en la memoria RAM a la que otros

procesos pueden tener acceso.

Elba Karen Sáenz García- Oscar René Valdez

Casillas4

Arquitectura de Memoria Compartida

Casi todas las computadoras actuales cuentan

con una arquitectura de memoria compartida

con múltiples unidades de procesamiento

conectadas a la misma memoria física.

Elba Karen Sáenz García- Oscar René Valdez

Casillas5

Multicore

• La carrera de creación de procesadores cada vez más rápidos sufrió un punto de inflexión con la aparición de procesadores con arquitectura multicore.

• Esta arquitectura permitía frenar la escalada de consumo de potencia.

• Las arquitecturas multicore permiten obtener un rendimiento equivalente sin la contraprestación del consumo y esto ha provocado un gran desarrollo en los últimos años.

• Ejemplo

– Samsung Galaxy S4 con un procesador con 8 cores.

Elba Karen Sáenz García- Oscar René Valdez

Casillas6

Multicore

• Para poder aprovechar la potencia que

ofrecen estos procesadores los

desarrolladores de software deben

transformar las actuales aplicaciones

secuenciales en paralelas.

Elba Karen Sáenz García- Oscar René Valdez

Casillas7

Referencia para diseño de programas

paralelos

• Seguir etapas de diseño de un programa paralelo (Ian- Foster)

http://www.mcs.anl.gov/~itf/dbpp/

• The Multicore Association en su MulticoreProgramming Practices ofrece un método para escribir software en arquitecturas multicoreutilizando Cy C++– Algunos integrantes: CriticalBlue, Freescale, Intel,

PolyCore Software, Texas Instruments, Wind River’s Virtutech subsidiary.

Elba Karen Sáenz García- Oscar René Valdez

Casillas8

Etapas de Diseño

Aplicar las etapas en el diseño de programas paralelos :

– Particionamiento

– Comunicación

– Aglomeración

– Mapeo

– Particionamiento

– Aglomeración

– Comunicación

– Mapeo

Elba Karen Sáenz García- Oscar René Valdez

Casillas9

Etapas de fase de diseño

• Particionamiento (descomposición de tareas). Detección de niveles de paralelismo y granularidad; así como de algoritmos paralelos.

• Comunicación (estructura necesaria para coordinar la ejecución). Manejo de alta cohesión y bajo acoplamiento entre subprocesos .

• Aglomeración: Evaluación de tareas y estructura con respecto al rendimiento y costo, combinando tareas para mejorar. Aplicación de paradigmas de programación paralela.

• Mapeo. (asignación de tareas a unidades de procesamiento). Decisión de la distribución de los procesos en los procesadores

Elba Karen Sáenz García- Oscar René Valdez

Casillas10

Fase Diseño V1

problema

particionamiento

tareas

comunicación

subprocesos concomunicación

Elba Karen Sáenz García- Oscar René Valdez

Casillas11

Fase Diseño V1

Elba Karen Sáenz García- Oscar René Valdez

Casillas12

aglomeración

subprocesos concomunicación

programasparalelos

mapeo

procesadores

Paradigmas de programación paralela

Planificación de procesos

Fase Diseño V2

Elba Karen Sáenz García- Oscar René Valdez

Casillas13

Multicore Programming PracticesAborda un conjunto de fases con el objetivo de parelelizar una

aplicación:

• Análisis de la aplicación y diseño de alto nivel: el objetivo de esta fase es analizar las características de la aplicación.

• Implementacion y diseño de bajo nivel: Selección de los patrones de diseño, algoritmos y estructuras de datos para la posterior codificación de la concurrencia necesaria.

• Depuración: La introducción de concurrencia implica condiciones especiales en la depuración del código.

• Rendimiento: Es un proceso de optimización en el que se analiza la mejora del rendimiento conseguido, identificando nuevos cuellos de botella en la ejecución del código, incluyendo comunicaciones, sincronización, bloqueos, equilibrado de carga y ubicación de los datos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas14

Particionamiento

o Descomposición

• Descomposición de dominio o datos

• Descomposición funcional o tareas

Elba Karen Sáenz García- Oscar René Valdez

Casillas15

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas16

Encontrar el elemento mayor en un arreglo de enteros

Primero se trabaja en la división de los datos y

después es el cómputo asociado

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas17

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas18

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas19

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas20

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas21

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar

René Valdez Casillas22

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas23

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas24

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas25

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas26

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición de dominio

Elba Karen Sáenz García- Oscar René Valdez

Casillas27

CPU 0 CPU 1 CPU 2 CPU 3

Encontrar el elemento mayor en un arreglo de enteros

Descomposición Funcional

• Primero se trabaja en la división de tareas o

funciones y despues en los datos asociados a

cada tarea

Elba Karen Sáenz García- Oscar René Valdez

Casillas28

Descomposición Funcional

Elba Karen Sáenz García- Oscar René Valdez

Casillas29

f()

s()

r()

q()h()

g()

Descomposición Funcional

Elba Karen Sáenz García- Oscar René Valdez

Casillas30

f()

s()

r()

q()h()

g()

CPU 0

CPU 2

CPU 1

Descomposición Funcional

Elba Karen Sáenz García- Oscar René Valdez

Casillas31

f()

s()

r()

q()h()

g()

CPU 0

CPU 2

CPU 1

Descomposición Funcional

Elba Karen Sáenz García- Oscar René Valdez

Casillas32

f()

s()

r()

q()h()

g()

CPU 0

CPU 2

CPU 1

Descomposición Funcional

Elba Karen Sáenz García- Oscar René Valdez

Casillas33

f()

s()

r()

q()h()

g()

CPU 0

CPU 2

CPU 1

Descomposición Funcional

Elba Karen Sáenz García- Oscar René Valdez

Casillas34

f()

s()

r()

q()h()

g()

CPU 0

CPU 2

CPU 1

Descomposición pipilined

Elba Karen Sáenz García- Oscar René Valdez

Casillas35

Gráfica de dependencias

Grafica = (nodo, flecha)

• Nodo por cada

– variable (excepto variables índice)

– Constante

– Operador o función

• Flechas indican uso de variables y constantes

Elba Karen Sáenz García- Oscar René Valdez

Casillas36

Gráfica de dependencias

Ejemplo #1

Elba Karen Sáenz García- Oscar René Valdez

Casillas37

for (i = 0; i < 3; i++)

a[i] = b[i] / 2.0;

b[0] b[1] b[2]

a[0] a[1] a[2]

///

2 2 2

Gráfica de dependencias

Ejemplo #1

Elba Karen Sáenz García- Oscar René Valdez

Casillas38

for (i = 0; i < 3; i++)

a[i] = b[i] / 2.0;

b[0] b[1] b[2]

a[0] a[1] a[2]

///

2 2 2

Gráfica de dependencias

Ejemplo #2

Elba Karen Sáenz García- Oscar René Valdez

Casillas39

for (i = 1; i < 4; i++)

a[i] = a[i-1] * b[i];

b[1] b[2] b[3]

a[1] a[2] a[3]

***

a[0]

Gráfica de dependencias

Ejemplo #2

Elba Karen Sáenz García- Oscar René Valdez

Casillas40

for (i = 1; i < 4; i++)

a[i] = a[i-1] * b[i];

b[1] b[2] b[3]

a[1] a[2] a[3]

***

a[0]

Gráfica de dependencias

Ejemplo #3

Elba Karen Sáenz García- Oscar René Valdez

Casillas41

a = f(x, y, z);

b = g(w, x);

t = a + b;

c = h(z);

s = t / c;

x

f

w y z

ab

g

t

c

s

/

h

Gráfica de dependencias

Ejemplo #3

Elba Karen Sáenz García- Oscar René Valdez

Casillas42

a = f(x, y, z);

b = g(w, x);

t = a + b;

c = h(z);

s = t / c;

x

f

w y z

ab

g

t

c

s

/

h

Gráfica de dependencias

Ejemplo #4

Elba Karen Sáenz García- Oscar René Valdez

Casillas43

for (i = 0; i < 3; i++)

a[i] = a[i] / 2.0;

a[0] a[1] a[2]

a[0] a[1] a[2]

///

2 2 2

Gráfica de dependencias

Ejemplo #4

Elba Karen Sáenz García- Oscar René Valdez

Casillas44

for (i = 0; i < 3; i++)

a[i] = a[i] / 2.0;

a[0] a[1] a[2]

a[0] a[1] a[2]

///

2 2 2

Otros ejemplos

Elba Karen Sáenz García- Oscar René Valdez

Casillas45

¿Es posible encontrar paralelismo?

• Renderizar una foto

• Búsqueda de una palabra en un documento

• Actualizar una hoja de cálculo

• Compilar un programa

Elba Karen Sáenz García- Oscar René Valdez

Casillas46

Conceptos de Paralelismo

Elba Karen Sáenz García- Oscar René Valdez

Casillas47

Paralelismo

• Existen dos visiones del paralelismo:

– Paralelismo Hardware: definido por la arquitectura

de la máquina

– Paralelismo Software: Definido por la estructura

del programa. Se manifiesta en las instrucciones

que no tienen dependencia

Elba Karen Sáenz García- Oscar René Valdez

Casillas48

Niveles de paralelismo• Paralelismo a nivel de tarea o trabajo: Diferentes tareas

se ejecutan simultáneamente en diferentes Unidades de procesamiento (UP).

• Paralelismo a nivel de programa: Dividir tarea en subtareas y asignarlas a diferentes UP.

• Paralelismo a nivel de instrucción: Ejecutar instrucciones independientes en forma simultánea.

• Paralelismo a nivel de bit: De bajo nivel, se logra a través del hardware

Elba Karen Sáenz García- Oscar René Valdez

Casillas49

Concurrencia y paralelismo

• Programa concurrente: Es aquél que define acciones que pueden realizarse simultáneamente

• Programa paralelo: Es un programa concurrente diseñado para su ejecución en un hardware paralelo

• Programa distribuido: Es un programa paralelo diseñado para su ejecución en una red de procesadores autónomos que no comparten la memoria

Elba Karen Sáenz García- Oscar René Valdez

Casillas50

Modelos de programación

• Shared Memory

• Threads

• Distributed Memory / Message Passing

• Data Parallel

• Hybrid

• Single Program Multiple Data (SPMD)

• Multiple Program Multiple Data (MPMD)

Elba Karen Sáenz García- Oscar René Valdez

Casillas51

Alternativas para modelo de memoria

compartida

• En el caso de memoria compartida.

– trabajar con procesos (UNIX)

– usar threads: Pthreads (POSIX), Java, OpenMP…

Elba Karen Sáenz García- Oscar René Valdez

Casillas52

Introducción a

Open Multiprocessing (OpenMP)

Proyecto PAPIME PE104911

Elba Karen Sáenz García- Oscar René Valdez

Casillas53

¿Qué es OpenMP?

• API para programación multiproceso en computadoras con arquitectura de memoria compartida, en múltiples plataformas.

• Formada por

– directivas del compilador

– bibliotecas de funciones

– variables de ambiente,

No un lenguaje.

• Basado en el modelo de hilos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas54

Open MPDefinido por un grupo de proveedores de hardware y de software AMD

(OpenMP ARB 1997)

• BCS - Barcelona Supercomputing Center

• CAPS-Entreprise

• Convey Computer

• Cray

• Fujitsu

• HP

• IBM

• Intel

• Microsoft

• NEC

• NVIDIA

• Oracle Corporation

• Signalogic

• The Portland Group, Inc.

• Texas Instruments

Mas información en www.openmp.org

Elba Karen Sáenz García- Oscar René Valdez

Casillas55

¿Qué es OpenMP?

• Modelo de programación paralelo.

• Paralelismo de memoria compartida.

• Extensiones para lenguajes de programación

existentes (C,C++, Fortran)

• Combina código serial y paralelo en un solo

archivo fuente.

Elba Karen Sáenz García- Oscar René Valdez

Casillas56

Algunos Compiladores

Compañía Compilador Información

GNU gcc Usado en Linux, Solaris, AIX, MacOSX, Windows

OpenMP 3.1 y soportado desde GCC 4.7

–fopenmp

IBM XL C/C++ /

Fortran

Usado en AIX y Linux.

Oracle C/C++ / Fortran Solaris y Linux

Intel C/C++ / Fortran

(10.1)

Windows, Linux y MacOSX.

/Qopenmp y -openmp

Elba Karen Sáenz García- Oscar René Valdez

Casillas57

Algunas preguntas

• ¿Qué es un proceso?

• ¿Qué es un hilo?

• ¿Qué se comparte entre los hilos?

• ¿Cuál es la diferencia entre hilo y proceso?

Elba Karen Sáenz García- Oscar René Valdez

Casillas58

Proceso

• Programa en algún estado en ejecución.

– Poseen espacios de memoria independientes

– Los cambios de estado (cambios de contexto) son

relativamente costosos en términos de tiempo.

Elba Karen Sáenz García- Oscar René Valdez

Casillas59

Estados de un proceso

Elba Karen Sáenz García- Oscar René Valdez

Casillas60

Estados de un proceso

• En un principio, un proceso no existe.

• Una vez creado el proceso pasa al estado

denominado Listo(está en condiciones de hacer

uso de la CPU en cuanto se le dé la oportunidad.

• Un proceso puede pasar de Ejecución a

Bloqueado cuando ha de esperar porque ocurra

un determinado evento o suceso.

– Espera por la terminación de una operación de E/S o

finalización de otra tarea de otro proceso

Elba Karen Sáenz García- Oscar René Valdez

Casillas61

Hilos (Thread)

• Dentro de un proceso puede haber varios hilos de ejecución.

• Un hilo, también llamado hebra, proceso ligero, flujo, subproceso o “thread” es un programa en ejecución que comparte la imagen de memoria y otros recursos del proceso con otros hilos.

• Por tanto, un hilo puede definirse como cada secuencia de control dentro de un proceso que ejecuta sus instrucciones de forma independiente.

Elba Karen Sáenz García- Oscar René Valdez

Casillas62

Procesos con un solo hilo y con

múltiples hilos

Elba Karen Sáenz García- Oscar René Valdez

Casillas63

Código Datos Archivos Código Datos Archivos

Hilo Hilos

Mono-hilo Multi-hilo

Hilos y procesos

Elba Karen Sáenz García- Oscar René Valdez

Casillas64

un procesoun hilo

varios procesosun hilo por proceso

varios procesosvarios hilos por proceso

un procesovarios hilos

Empezando con OpenMP

Proyecto PAPIME PE104911

Elba Karen Sáenz García- Oscar René Valdez

Casillas65

Arquitectura de OpenMP

• Fork/join (Maestro esclavo)

• Trabajo Y Datos Compartido entre hilos

• Maneja sincronización (barreras, otras)

Elba Karen Sáenz García- Oscar René Valdez

Casillas66

Fork / Join

Elba Karen Sáenz García- Oscar René Valdez

Casillas67

F

O

R

K

J

O

I

N

J

O

I

N

F

O

R

K

Master

ThreadParallel

Regions

Sintaxis

• Directivas o pragmas

– #pragma omp construct [clause [clause]…]

– Clausulas: Especifican atributos para compartir

datos y calendarización

Una pragma en C o C++ es un directivo al

compilador.

Elba Karen Sáenz García- Oscar René Valdez

Casillas68

Regiones paralelas

Elba Karen Sáenz García- Oscar René Valdez

Casillas69

#pragma omp parallel

Thread

1

Thread

2

Thread

3

Implicit Barrier

Master Thread

Regiones paralelas

• Los hilos son creados desde el pragma

parallel.

• Los datos son compartidos entre los hilos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas70

C/C++ : #pragma omp parallel

{

bloque código

}

¿Cuántos hilos?

• Num. Hilos = Num. Procesadores o núcleos

• Intel lo usa de esta forma.

• Se definen más hilos con la variable de

ambiente

OMP_NUM_THREADS.

Elba Karen Sáenz García- Oscar René Valdez

Casillas71

Actividad 1

• Compilar la versión serial.

#include <stdio.h>

int main() {

int i;

printf(“Hola Mundo\n");

for(i=0;i<6;i++)

printf("Iter:%d\n",i);

printf(“Adios \n");

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas72

Actividad 1

• Agregar la directiva para ejecutar las primeras

cuatro líneas del main en paralelo.

• Compilar con la opción -fopenmp

• ¿Qué sucede?

Elba Karen Sáenz García- Oscar René Valdez

Casillas73

Actividad 2

• Aumentar el número de hilos a 4 y ejecutar el

programa

• $ export OMP_NUM_THREADS=4

• Ejecutar el programa con más hilos y describir

lo que sucede.

Elba Karen Sáenz García- Oscar René Valdez

Casillas74

Número de hilos en la región paralela

El número de hilos que se generan para ejecutar una región

paralela se controla:

Elba Karen Sáenz García- Oscar René Valdez

Casillas75

a. estáticamente, mediante una variable de entorno:

> export OMP_NUM_THREADS=4

b. en ejecución, mediante una función :

omp_set_num_threads(4);

c. en ejecución, mediante una cláusula del “pragma

parallel”:

num_threads(4)

Regiones paralelas

Work – Sharing

constructor for

#pragma omp paralell

#pragma omp for

for(i=0;i<100;i++) {

Realizar Trabajo();

}

• Divide las iteraciones entre los hilos.

• Debe estar especificada en una región paralela

Elba Karen Sáenz García- Oscar René Valdez

Casillas76

#pragma omp parallel#pragma omp for

for(i = 0; i < 12; i++) c[i] = a[i] + b[i]

#pragma omp parallel

#pragma omp for

Implicit barrier

i = 0

i = 1

i = 2

i = 3

i = 4

i = 5

i = 6

i = 7

i = 8

i = 9

i = 10

i = 11

#pragma omp parallel

#pragma omp for

Implicit barrier

i = 0

i = 1

i = 2

i = 3

i = 4

i = 5

i = 6

i = 7

i = 8

i = 9

i = 10

i = 11

Elba Karen Sáenz García- Oscar René Valdez

Casillas77

Combinando Pragmas

• Estos dos segmentos de código son equivalentes.

Elba Karen Sáenz García- Oscar René Valdez

Casillas78

#pragma omp parallel {

#pragma omp forfor (i=0; i< MAX; i++) {

res[i] = huge();}

}

#pragma omp parallel forfor (i=0; i< MAX; i++) {

res[i] = huge();}

Actividad

• Modificar el programa de la actividad 1 para

dividir el número de iteraciones entre los

hilos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas79

Variables Compartidas y Privadas

El hilo maestro tiene como contexto el conjunto de variables del programa, y existe a lo largo de toda la ejecución del programa.

Al crearse nuevos hilos, cada uno incluye su propio contexto, con su propia pila, utilizada como stack frame para las rutinas invocadas por el hilo

Las variables definidas por el hilo maestro son compartidas por todos los hilos. Sin embargo, algunas variables deberán ser propias de cada , privadas.

.

Elba Karen Sáenz García- Oscar René Valdez

Casillas80

Regiones paralelas

Condiciones de carrera

• Una condición de carrera (race condition)

ocurre cuando dos o mas hilos acceden a un

recurso compartido sin control.

• Lo más común es el conflicto en el

almacenamiento• Acceso concurrente de la misma dirección de memoria

por varios hilos

• Al menos un hilo está escribiendo

Elba Karen Sáenz García- Oscar René Valdez

Casillas81

Variables Compartidas y Privadas

Elba Karen Sáenz García- Oscar René Valdez

Casillas82

Shared-Memory Model and Threads

Shared

Variables

Private

Variables

Private

Variables

Thread

Thread

Ejemplo descomposición de dominio

código secuencial:

int a[1000], i;

for ( i = 0; i < 1000; i++) a[ i]= foo (i);

Thread 0:

for ( i=0;i<500 ; i++) a[ i] = foo (i);

Thread 1:

for ( i=500;i<1000 ; i++) a[ i] = foo (i);

Elba Karen Sáenz García- Oscar René Valdez

Casillas83

Shared

Private

Descomposición Funcionalvolatile int e;

main () {int x[10], j, k, m; j = f(x, k); m = g(x. k);

}

int f(int *x, int k){

int a; a = e * x[k] * x[k]; return a;}

int g(int *x, int k){

int a; k = k-1; a = e / x[k]; return a;}

Elba Karen Sáenz García- Oscar René Valdez

Casillas84

Thread 0

Thread 1

Variables locales a funciones: Private

Clausulas

• shared(X )

Elba Karen Sáenz García- Oscar René Valdez

Casillas85

Se declara la variable X como compartida por todos los

hilos.

Sólo existe una copia, y todos los hilos acceden y modifican

dicha copia.

Se declara la variable Y como privada en cada hilo. Se crean

P copias, una por hilo(sin inicializar!).

Se destruyen al finalizar la ejecución de los hilos.

R.P.: Cláusulas de ámbito

���� private(Y)

Ejemplo

Realizar un programa que sume dos arreglos unidimensionales y los almacene en un tercer arreglo.

float x, y ; int I, c[N];

#pragma omp parallel for private( x,y )for( i=0; i<N; i++) {

x = a[ i]; y = b[ i];c[ i] = x + y;

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas86

Ejemplo

problemas con private• Se requiere realizar el producto entre dos vectores de dimensión n.

float prod_punto(float* a, float* b, int N) {

float sum = 0.0;#pragma omp parallel for

for (int i=0; i<N; i++){

sum += a[i] * b[i];}

return sum;}

Elba Karen Sáenz García- Oscar René Valdez

Casillas87

Funciones de ambiente

• void omp_set_num_threads(int nthreads)

• int omp_get_num_threads(void)

• int omp_get_max_threads(void)

• int omp_get_thread_num(void)

• int omp_get_num_procs(void)

Elba Karen Sáenz García- Oscar René Valdez

Casillas88

¿Quién soy yo? ¿Cuántos somos?

• Cada hilo paralelo se identifica por un número. El 0 es el hilo

maestro.

• Dos funciones de la bibliotreca omp.h:

Elba Karen Sáenz García- Oscar René Valdez

Casillas89

nth = omp_get_num_threads();

devuelve el número de hilos generados.

tid = omp_get_thread_num();

devuelve el identificador del thread.

Regiones paralelas

Ejercicio

• Realizar un programa donde dentro de una

región paralela se muestren los identificadores

de los hilos y el número total de hilos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas90

Región crítica

• Una región o sección crítica es una secuencia

de instrucciones que no debe ser

interrumpida por otros proceso

Elba Karen Sáenz García- Oscar René Valdez

Casillas91

Constructor critical

Elba Karen Sáenz García- Oscar René Valdez

Casillas92

float dot_prod(float* a, float* b, int N) {

float sum = 0.0;#pragma omp parallel forfor (int i=0; i<N; i++){

#pragma omp criticalsum += a[i] * b[i];

}return sum;

}

// Sintaxis: #pragma omp critical [(lock_name)]

¿Cuál será el problema aquí?

Ejercicio- paralelizar#include <omp.h>

#include <stdio.h>

#include <stdlib.h>

#define SIZE 10

int main()

{

int i;

int max;

int a[SIZE];

for (i = 0; i < SIZE; i++)

{

a[i] = rand();

printf("%d\n", a[i]);

}

max = a[0];

for (i = 1; i < SIZE; i++)

{

if (a[i] > max)

{

max = a[i];

}

}

printf("max = %d\n", max);

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas93

Asignando Iteraciones

• La cláusula schedule permite dividir las

iteraciones de los ciclos entre los hilos, indica

como las iteraciones se asignan a los hilos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas94

Clausula schedule

• schedule(static ,[chunk])– Bloques de iteraciones de tamaño “chunk” a los

hilos

– Distribución Round robin

• schedule (dynamic,[chunk])– Los hilos toman un numero “chunk” de

iteraciones, cuando estan sin trabajo.

• schedule(guided,[chunck])Cada thread toma iteraciones dinámicamente y

– progresivamente va tomando menos iteraciones.

Elba Karen Sáenz García- Oscar René Valdez

Casillas95

Elba Karen Sáenz García- Oscar René Valdez

Casillas96

Ejemplo

#pragma omp parallel for schedule (static, 8)

for( int i = start; i <= end; i += 2 )

{

if ( TestForPrime(i) ) gPrimesFound++;

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas97

Referencias

• Introduction to parallel programming, Intel Software College, junio 2007

• Multicore programming practices guide, TheMulticore Association

• www.openmp.org

• R. Chandra .Parallel Programming in OpenMP ,Morgan Kaufmann, 2001.

• B. Chapman ,Using OpenMP, The MIT Press, 2008.

Elba Karen Sáenz García- Oscar René Valdez

Casillas98

Programación Paralela en OpenMp

Parte 2

Proyecto PAPIME PE104911

Facultad de Ingeniería UNAM

Elba Karen Sáenz García- Oscar René Valdez

Casillas 99

Clausula reduction

• Las operaciones de reducción son comunes en

muchas aplicaciones paralelas.

• Utilizan variables a las que acceden todos los

procesos/hilos y sobre las que se efectúa

alguna operación de “acumulación” en modo

atómico.

Elba Karen Sáenz García- Oscar René Valdez

Casillas100

Elba Karen Sáenz García- Oscar René Valdez

Casillas

Cláusula reduction

#pragma omp reduction(operator:variable)

OJO: no se sabe en qué orden se va a ejecutar la operación

--> debe ser conmutativa (cuidado con el redondeo).

#pragma omp parallel private(X) reduction(+:sum){

X = ……sum = sum + X;…

}

La operador de

reducción a utilizar.

101

Elba Karen Sáenz García- Oscar René Valdez

Casillas

Operaciones utilizados en reducciones

(C/C++) Operator Initial Value

+ 0

* 1

- 0

^ 0

Operator Initial Value

& 0

| 0

&& 1

|| 0

102

Actividad

• Realizar un programa que realice el producto

punto de dos vectores de dimensión n.

• Paralelizar el programa.

Elba Karen Sáenz García- Oscar René Valdez

Casillas103

Cálculo del número Pi

• π= ∫0

1

4/(1+x2) dx

• La Regla de rectángulo consiste de estimar el

área debajo de la curva y=4/(1+x2) entre x=0 y

x=1 mediante áreas de rectángulos

Elba Karen Sáenz García- Oscar René Valdez

Casillas104

Código Serial#include <stdio.h>

#include <time.h>

long long num_steps = 1000000000;

double step;

int main(int argc, char* argv[])

{

clock_t start, stop;

double x, pi, sum=0.0;

int i;

start = clock();

for (i=0; i<num_steps; i++)

{

x = (i + .5)*step;

sum = sum + 4.0/(1.+ x*x);

}

pi = sum*step;

stop = clock();

printf(“El valor de Pi es %15.12f\n",pi);

printf(“El tiempo para calcular PI fue %f segundos\n",((double)(stop -start)/1000.0));

return 0;

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas105

Para medir tiempo en OpenMP

double empezar,terminar;

empezar=omp_get_wtime( );

…código

terminar=omp_get_wtime();

printf(“TIEMPO=%lf\n”,empezar-terminar)

El resultado es en segundos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas106

Una Solución

#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)

#pragma omp parallel

{

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;

}Elba Karen Sáenz García- Oscar René Valdez

Casillas107

Otra Solución

#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);

#pragma omp parallel 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;

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas108

Clausula firstprivate

• Las variables privadas no se inicializan y al

terminar la región paralela tienen un valor

indefinido.

• Para inicializar una variable privada se utiliza

firstprivate.

Elba Karen Sáenz García- Oscar René Valdez

Casillas109

Ejemplo

X = Y = Z = 0;

#pragma omp parallelprivate(Y) firstprivate(Z)

{...X = Y = Z = 1;

}

...

valores dentro de la

región paralela?

X ====Y ====Z ====

valores fuera de la región

paralela?

X = Y = = = = Z ====

? (0)? (0)

1

0

0

?

Elba Karen Sáenz García- Oscar René Valdez

Casillas110

¿Cómo se puede paralelizar el siguiente

código?

x[0] = complex_function ();

for (i=0;j< n;i ++) {

for (j=1;j<4;j++)

x[j]=g( i,x [j -1]);

sol[ i] = x[1] – x[3 ];}

Se pueden dividir las itereciones del ciclo exterior sij y x son privadas. Sin embargo, x[0] se necesitaen la primera iteración del bucle interior.

Elba Karen Sáenz García- Oscar René Valdez

Casillas111

Una solución

x[0] = complex_function ();

#pragma omp parallel for private[j] firstprivate (x)

for (i -0;j< n;i ++) {

for (j=1;j<4;j++)

x[j]=g( i,x [j -1]);

sol[ i] = x[1] – x[3];}

Elba Karen Sáenz García- Oscar René Valdez

Casillas112

Descomposicion Funcional

v = alpha();w = beta();x = gamma(v, w);y = delta();printf ("%6.2f\n", epsilon(x,y));

alpha beta

gamma delta

epsilon

Elba Karen Sáenz García- Oscar René Valdez

Casillas113

¿Cómo se paraleliza?

Elba Karen Sáenz García- Oscar René Valdez

Casillas

alpha beta

gamma delta

epsilon

114

Paralelismo funcional

Secciones Paralelas

•Secciones independientes de código, se

pueden ejecutar de forma concurrente

Serial Parallel

#pragma omp parallel sections

{

#pragma omp section

phase1();

#pragma omp section

phase2();

#pragma omp section

phase3();

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas115

Constructor section

Permite usar paralelismo de funcional (descomposición

funcional).

Reparte secciones de código independiente a hilos

diferentes.

Cada sección paralela es ejecutada por un sólo hilo, y

cada hilo ejecuta ninguna o alguna sección.

Una barrera implícita sincroniza el final de las secciones

o

Rep. de tareas: funciones

Elba Karen Sáenz García- Oscar René Valdez

Casillas116

Posible solución

#pragma omp parallel sections{

#pragma omp section /* Opcional */v = alpha();

#pragma omp sectionw = beta();

#pragma omp sectiony = delta();

}x = gamma(v, w);printf ("%6.2f\n", epsilon(x,y));}

Elba Karen Sáenz García- Oscar René Valdez

Casillas117

Otra Posibilidad

alpha beta

gamma delta

epsilon

Ejecutar alpha ybeta en paralelo.Ejecutar gama ydelta en paralelo.

Elba Karen Sáenz García- Oscar René Valdez

Casillas118

Otra posibilidad#pragma omp parallel sections{#pragma omp section

v=alpha();#pragama omp section

w=beta();}#pragma omp parallel sections

{#pragma omp section

y=delta();#pragma omp section

x=gamma(v,w);}

printf(“%6.2f\n”,epsilon(x,y);

Elba Karen Sáenz García- Oscar René Valdez

Casillas119

Con dos secciones#pragma omp parallel

{#pragma omp sections

{#pragma omp section

v = alpha();#pragma omp section

w = beta();}

#pragma omp sections{#pragma omp section

x = gamma(v, w);#pragma omp section

y = delta();}

}printf ("%6.2f\n", epsilon(x,y));Elba Karen Sáenz García- Oscar René Valdez

Casillas120

Ejemplo de secciones

#pragma omp parallel sections

{

#pragma omp section

for( i=0;i< n;i ++)

c[ i]=a[ i]+b[ i];

#pragma omp section

for(j=0;j< n;j ++)

d[j]=e[j]+f[j];

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas121

Una posibilidad mejor

#pragma omp parallel{

#pragma omp forfor( i=0;i< n;i ++)

c[ i]=a[ i]+b[ i];#pragma omp for

for(j=0;j< n;j ++)d[j]=e[j]+f[j];

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas122

o simplemente

#pragma parallel for

for( i=0;i< n;i ++)

{

c[ i]=a[ i]+b[ i];

d[ i]=e[ i]+f[ i];

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas123

Barreras Implícitas

• Algunos constructores tiene barreras

implícitas

– Parallel

– For

– Single

• Barreras no necesarias perjudican el

desempeño

Elba Karen Sáenz García- Oscar René Valdez

Casillas124

Ejercicio

• Paralelizar los dos códigos proporcionados,

utilizando los constructores y clausulas vistos.

Elba Karen Sáenz García- Oscar René Valdez

Casillas125

Referencias

• www.openmp.org

• OpenMP 2.5 Specifications

• “”Rohit Chandra, Parallel Programming in OpenMP. Morgan KaufmannPublishers.

• Comunidad

– The community of OpenMP researchers and developers in

academia and industry

– http://www.compunity.org/

• Articulos conferencias:

– WOMPAT, EWOMP, WOMPEI, IWOMP

• http://www.nic.uoregon.edu/iwomp2005/index.html#program

Elba Karen Sáenz García- Oscar René Valdez

Casillas126

Programación Paralela en OpenMp

Parte 3

Proyecto PAPIME PE104911

Facultad de Ingeniería UNAM

127Elba Karen Sáenz García- Oscar René Valdez

Casillas

Constructor Barrier

• Barrera Explicita

• Cada hilo espera hasta que todos lleguen a la

barrera#pragma omp parallel shared (A, B, C) {

DoSomeWork(A,B);printf(“Processed A into B\n”);

#pragma omp barrier DoSomeWork(B,C);printf(“Processed B into C\n”);

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas128

Constructor single

• Define un bloque básico de código, dentro de

una región paralela, que debe ser ejecutado

por un único hilo.

• Ejemplo, una operación de entrada/salida.

• No se especifica qué hilo ejecutará la tarea.

Elba Karen Sáenz García- Oscar René Valdez

Casillas129

Constructor single

• #pragma omp single

#pragma omp parallel{

DoManyThings();#pragma omp single{

ExchangeBoundaries();} // Hilos esperan

DoManyMoreThings();}

Elba Karen Sáenz García- Oscar René Valdez

Casillas130

#pragma omp parallel

{

... ;

#pragma omp single

inicializar(A);

#pragma omp for

for(i=0; i<N; i++)

A[i] = A[i] * A[i] + 1;

... ;

#pragma omp single

copiar(B,A);

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas131

singlesinglesinglesingle

for

singlesinglesinglesingle

parallel

Constructor maestro

#pragma omp master { }

#pragma omp parallel{

DoManyThings();#pragma omp master{ // si no es el maestro,salta

ExchangeBoundaries();}DoManyMoreThings();

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas132

#include <omp.h>

#include <stdio.h>

int main( )

{

int a[5], i;

#pragma omp parallel

{

#pragma omp for

for (i = 0; i < 5; i++)

a[i] = i * i;

#pragma omp master

for (i = 0; i < 5; i++)

printf_s("a[%d] = %d\n", i, a[i]);

#pragma omp barrier

#pragma omp for

for (i = 0; i < 5; i++)

a[i] += i;

}

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas133

Barreras Implícitas

• Algunos constructores tiene barreras

implícitas

– Parallel

– For

– Single

• Barreras no necesarias perjudican el

desempeño

Elba Karen Sáenz García- Oscar René Valdez

Casillas134

Clausula nowait

• Permite ignorar barreras implicitas

#pragma omp for nowait

for(...)

{...};

#pragma single nowait

{ [...] }

#pragma omp for schedule(dynamic,1) nowait

for(int i=0; i<n; i++)

a[i] = bigFunc1(i);

#pragma omp for schedule(dynamic,1)

for(int j=0; j<m; j++)

b[j] = bigFunc2(j);

Elba Karen Sáenz García- Oscar René Valdez

Casillas135

Constructor atomic

• Asegura que una posición específica de memoria debe ser modificada de forma atómica, sin permitir que múltiples hilos intenten escribir en ella de forma simultánea. (sección critica).

• La sentencia debe tener una de las siguientes formas:

x <operacion-binaria> = <expr>

x++

++x

x---

---x

Elba Karen Sáenz García- Oscar René Valdez

Casillas136

Ejemplo atomic

#include <stdio.h>

#include <omp.h>

#define MAX 10

int main() {

int count = 0;

#pragma omp parallel num_threads(MAX)

{

#pragma omp atomic

count++;

}

printf("Number of threads: %d\n", count);

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas137

Paralelismo anidado

• Por defecto no es posible anidar regiones paralelas, hay que indicarlo explícitamente mediante:– una llamada a una función

omp_set_nested(TRUE);– una variable de entorno

> export OMP_NESTED=TRUE

• Una función devuelve el estado de dicha opción:

• omp_get_nested(); (true o false)

Elba Karen Sáenz García- Oscar René Valdez

Casillas138

Paralelismo anidado

Elba Karen Sáenz García- Oscar René Valdez

Casillas139

Master

Región paralela externa

Región paralela anidada

Región paralela externa

Paralelismo anidado

• OpenMP 3.0 mejora el soporte al paralelismo anidado:

• -La función omp_set_num_threads() puede ser invocada dentro de una región paralela para controlar el grado del siguiente nivel de paralelismo.

• Permite conocer el nivel de anidamiento mediante omp_get_level() y omp_get_active_level().

• Se puede tener acceso al identificador del padre de nivel n omp_get_ancestor_thread_num(n)y al número de threadsen dicho nivel.

Elba Karen Sáenz García- Oscar René Valdez

Casillas140

Paralelismo anidado#include <omp.h>

#include <stdio.h>

void report_num_threads(int level)

{

#pragma omp single{printf("Level %d: number of threads in the team - %d\n",level, omp_get_num_threads());

}

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas141

int main() {

omp_set_dynamic(0);

#pragma omp parallel num_threads(2)

{

report_num_threads(1);

#pragma omp parallel num_threads(2)

{

report_num_threads(2);

#pragma omp parallel num_threads(2)

{

report_num_threads(3);

}

}

} return(0);

}

Elba Karen Sáenz García- Oscar René Valdez

Casillas142

Variable de ambiente

SUNW_MP_MAX_POOL_THREADS

• Máximo numero de hilos esclavos en una

región paralela

• Valor por defecto 1023

Elba Karen Sáenz García- Oscar René Valdez

Casillas143

Referencias

• R. Chandra et al,Parallel Programming in OpenMP,Morgan Kaufmann, 2001.

• B. Chapman et al Using OpenMP, The MIT Press, 2008.

• www.openmp.org

• Introduction to parallel programming, Intel Software College, junio 2007

Elba Karen Sáenz García- Oscar René Valdez

Casillas144