Aplicado a programas openMP

Slides:



Advertisements
Presentaciones similares
Estructuras de control Secuenciales y selectivas
Advertisements

PROGRAMACIÓN EN C.
Computadores de alta velocidad (la lista top500).
Introducción al OpenMP
Octavio Alberto Alvarez Giner Agustín Iván Mota González.
Tema 5 Sentencias básicas. Sentencia –Línea de código en C Básicas –Entrada de datos desde el teclado –Salida de datos por la pantalla –Asignación de.
Instrucciones Básicas Entrada de Información
Programando con OpenMP*
MANUAL EXPRESS DE C J.M.sevilla.
Repaso para la construcción del intérprete 2012
Estructuras de control
Fundamentos de la Programación Estructurada
Programacion de Computadora Prof. Obadiah Oghoerore.
Funciones. Programación, Algoritmos y Estructuras de Datos.
Una variable en un programa es algo con un nombre, cuyo valor puede variar. La manera en que el compilador y enlazador maneja esto es asignando un bloque.
Variables Prof. Gonzalo Pastor.
EJERCICIOS DE PROGRAMACION
INFORMATICA I Funciones CLASE 13.
ESTRUCTURA DEL LENGUAJE C
Aplicaciones Multihilo
Prof. Franklin Cedeño. FUNCIONES EN C++ Cuando tratamos de resolver un problema, resulta muy útil utilizar la filosofía de “divide y vencerás”. Esta estrategia.
Programación Estructurada
PROGRAMACIÓN DE SISTEMAS DE MEMORIA COMPARTIDA (SMP):
Ocurre con frecuencia, tanto en programación como en la vida real, que las decisiones que se nos pide tomar son más complicadas que una simple selección.
SOBRECARGA DE FUNCIONES
Ejemplos en C /* Ejemplos L/E en C con printf y scanf */ #include #include main(){ int i; int i; char nombre[30]; char nombre[30]; printf ("\nIntroduce.
String o Cadenas Prof. Gonzalo Pastor. Cadenas o String ► En C, una cadena o texto se define como un vector de caracteres de longitud determinada que.
Compiladores Análisis Léxico Oscar Bonilla Universidad Galileo.
Funciones “En C” Semestre de Otoño 2006 Claudio Gutiérrez-Soto.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
El lenguaje de programación C - Funciones -
Programa “Coordenadas” Ing. Arturo Díaz Vargas Departamento de Sistemas División de Ciencias Básicas e Ingeniería UNIVERSIDAD AUTONOMA METROPOLITANA.
Asignatura: Lenguaje de Programación de Sistemas PPT No.05 Programa vespertino de Ingeniería (E) en Sistemas Computacionales Profesor: José Estay Araya.
Signal, kill, sigaction y máscara de señales
Lab.5: Taller básico de OpenMP
Semana 5 Subprogramas..
Tema 7c Entrada y salida de funciones. Funciones Funcion Entradas SalidasTareas.
Sección 5-2 Estructuras de Control de Decisión Expresiones Lógicas.
Tres Algoritmos Paralelos para Multiplicación Matriz Vector
Cadenas y apuntadores Programación.
Estructuras de Iteracion (Repetitivas ) while , for,, do-while
Archivos.
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Analisis de Rendimiento.
Lenguaje C Ing. Sonia Alexandra Pinzón Nuñez
Algo mas de OPENMP y todo sobre PBS!. Algunas rutinas que devuelven variables de entorno  void omp_set_num_threads(int num_threads); // numero de threads.
Ejemplos openMP.
Programación de Memoria Compartida
Programación de Memoria Compartida
Administración de Proyectos de desarrollo de Software Ciclo de vida de un proyecto Enfoque moderno Temas Componentes Directivas Declaraciones globales.
Programación en MPI Capítulo 4. 4–2 NOT Gate 4–3 AND Gate.
OpenMP C and C++ Application Program Interface. Version October 1998.
Introducción a la Programación “El lenguaje C” Manuel Crisosto M., Claudio Gutiérrez S., Christian Vidal C.
Elementos básicos del lenguaje
14 de diciembre de 2005 Universidad de Murcia1 Programación en Memoria Compartida: OpenMP Domingo Giménez Departamento de Informática y Sistemas Universidad.
Programación orientada a objetos. El método main es el comportamiento por el cual comienzan todos los programas en Java, de la misma forma en la que C,
Definición de subprogramas en C
Por: Mario Felaco Mercedes Martinez Sistemas Operativos III Ene-Mar 2007.
Programación de Memoria Compartida
LENGUAJE “C” Programación.
Programación estructurada
Clase 1 Gabriela Araya Baez.. Char: Variable que almacena caracteres. Int: Variable que almacena enteros. Float: Variable que almacena decimales. Doble:
ARREGLOS O ARRAYS.
TIPOS DE DATOS Estructuras de control y repetición PARCIAL III.
OBJETIVOS DEFINIR LA ESTRUCTURA DE ARREGLOS. DECLARAR ARREGLOS EN C.
Programación con OpenMP* Dr. Marco Antonio Ramos Corchado Fuente Intel.
Control, adquisición y monitoreo con Arduino y Visual Basic .net
FUNCIONES Y PROCEDIMIENTOS
TEXTO AQUÍ TEXTO AQUÍ. TEXTO AQUÍ TEXTO AQUÍ.
Message Passing Interface
Puntero #include int main(int argc, char *argv[]) { int myVar = 378; printf("El valor de la variable es: %d\n", myVar); printf("Dirección de memoria de.
Transcripción de la presentación:

Aplicado a programas openMP Rendimiento Aplicado a programas openMP

Speedup Speedup = ts /tp donde ts es el tiempo que se requiere para ejecutar el programa secuencialmente y tp es el tiempo que se requiere para ejecutar el programa en paralelo El autor del texto denota speedup por ψ(n,p) donde n es el tamaño del problema y p es el número de procesos

Speedup (cont) ψ(n,p)≤p ψ(n,p)=p si el problema se particiona perfectamente en p procesos iguales y no hay ningun “overhead” debido a, por ejemplo, comunicaciones, coordenació de procesos, el costo de particionar, etc.

omp_get_wtime Esta función devuelve un valor en punto flotante doble igual al tiempo que ha transcurrido desde algun tiempo en el pasado. Se puede medir el tiempo que tarda un como sigue: empezar = omp_get_wtime; // aqui va el código cuyo tiempo de ejecutación se desea medir final = omp_get_wtime; tiempo = final – empezar;

Medir el tiempo para aproximar π // Entramos el numero de hilos desde la linea de comando #include <omp.h> #include <stdio.h> #include<time.h> #include<sys/time.h> int main (int argc, char *argv[]) { double area,x,start,end; int i,n; area = 0.0; printf("n="); scanf("%d",&n);

Medir tiempo de aproximar π (cont) omp_set_num_threads(atoi(argv[1])); start=omp_get_wtime; #pragma omp parallel for private(x) reduction(+:area); for (i=0;i<n;i++) { x=(i+0.5)/n; area += 4.0/(1.0+x*x); } end=omp_get_wtime; printf(“tiempo=%lf\n”,end-start); printf("pi = %lf\n", area/n); return 0;

Algunos trucos para mejorar rendimiento Invertir bucles Ejecutar bucles condicionalmente Usar la cláusula schedule

Mejormiento en Rendimiento Invertiendo Bucles Muchos fork/joins puede empeorar el rendimiento Invertir bucles puede mejorar el rendimiento si Hay paralelismo en el bucle interio El bucle exterior se puede paralelizar después de la inversión. La inversión no disminuye la razón de “cache hits”

Ejemplo 1 for (j=2;j<n;j++) for (i=1;i<n;i++) a[i][j] = a[i][j]+a[i][j-1]]; Lo mejor es paralelizar el bucle exterior, pero en este caso hay dependencias.l

Ejemplo 1 (cont) Se puede invertir los bucles: #omp parallel for for (i=1;i<n;i++) for (j=2; j<n;j++) a[i][j] = a[i][j]+a[i][j-1]]; Aqui hemos reducido los gastos de paralelizar, pero el nuevo bulce podria utilizar peor el cache.

Ejemplo 2 Intercambiando los bulces en for (i=2;i<=m;i++) for (j=1;j<=n;j++) a[i][j] = 2*a[i][j]; tenemos #pragma parallel for private(i) for(j=1;j<=n;j++) for(i=2;i<=m;i++) (columnas se pueden poner al dia simultaneamente – no filas)

Mejormiento en Rendimiento Ejecutando Bucles Condicionalmente Si un bucle tiene pocas iteraciones, los gastos generales podría ser mayor que la economia de ejecutación paralela. La cláusula if instruye al compilador determinar si el bucle se debe ejecutar en paralelo. #pragma omp parallel for if(n > 5000)

Mejormiento en Rendimiento usando la cláusula schedule Las iteraciones de un bucles pueden variar mucho en duración. Se puede usar una cláusula schedule para indicar como las iteraciones se asignan a los hilos.

Ejemplo for (i=0;i<n;i++) for (j=i;j<n;j++) a[i][j] = alpha_omega(i,j); Si toda iteraciión requiere el mismo tiempo, entonces el tiempo que requiere la primera iteración es n veces del tiempo que requiere la ultima iteraciión.

Estático vs. Dinámico Schedule estática: todas las iteraciones se asignan a los hilos antes de ejecutarla Schedule dinámica: solamente algunas iteraciones se asignan al prinicipio de la ejecutación de un bucle. Las otras iteraciones se asignan a hilos que terminan sus iteraciones asignadas.

Estático vs. Dinámico (cont) Static scheduling: -Gastos generales menores (“low overhead”) Dynamic scheduling Gastos generales mayores Puede reduce el imbalance de trabajo

Chunks Un chunk es un conjunto contiguos de iteraciones que se asignan a hilos Aumentar el tamaño de un chunk reduce los gastos generales y podría aumentar el “cache hit rate” Disminuir el tamaño de chunk permite uno a obtener un balance mas preciso del trabajo

La Cláusula schedule La sintaxis: schedule (<tipo>[,<chunk> ]) Se requiere tipo, pero el tamaño del chunk es opcional El tipo puede ser static dynamic guided runtime

Opciones para schedule schedule(static): asignar bloques de aproximadamente n/t iteraciones contiguas a cada hilo schedule(static,C): asignar chunks de tamaño C schedule(dynamic): asignar dinámicamente iteraciones una por una. schedule(dynamic,C): asignar dinámicamente C iteraciones a la vez

Opciones para schedule (cont) schedule(guided, C): asignar chunks dinámicamente. Los tamaños de los chunks disminuyen dependiendo de la implementación. C es el tamaño mínimo. schedule(guided): Lo mismo excepto 1 es el tamaño mínimo. schedule(runtime): el tipo de schedule se escoge al tiempo de ejecutación basado en el valor de la variable omp_schedule.

El ejemplo anterior con schedule #pragma omp parallel for private(j) schedule(static,1) for (i=0;i<n;i++) for (j=i;j<n;j++) a[i][j] = alpha_omega(i,j) Se podria aumentar el tamaño de chunk para mejorar la razón de “cache hits”, al costo de aumentar el imbalance de trabajo de los hilos.

Mas sobre speedup Los componentes de tiempo de ejecutación: - Computaciones que tienen que hacer secuencialmente: (n) - Computaciones que se pueden llevar a cabo en paralelo: (n) - Operaciones de comunicaciones: (n,p)

Expresión para Speedup ts = (n) + (n) tp = (n) + (n)/p + (n,p) Por lo tanto, ψ(n,p) ≤ ((n) + (n))/((n) + (n)/p + (n,p))

(n)/p Aumentar el número de procesadores reduce el tiempo computacional (n)/p

(n,p) El tiempo de comunicaciones crece con la cantidad de procesadores (n,p)

(n)/p + (n,p) En algun momento el tiempo de comunicaciones será mayor que el tiempo computacional (n)/p + (n,p)

Speedup

Eficiencia Notemos que (n,p)=ψ(n,p)/p Eficiencia = tS / (p*tp) donde p es el número de procesadores Ya que tp ≤ tS / p, tenemos que 0 ≤ Eficiencia ≤ 1 El autor denota eficiencia por (n,p) Notemos que (n,p)=ψ(n,p)/p

La Ley de Amdahl ≤ ((n) + (n))/((n) + (n)/p ) ψ(n,p) ≤ ((n) + (n))/((n) + (n)/p + (n,p)) ≤ ((n) + (n))/((n) + (n)/p ) La Ley de Amdahl: Si f es la porción de la computación que es inherentemente secuencial, es decir que f=(n)/((n) + (n)), entonces ψ ≤ 1/(f+(1-f)/p) Notemos que ψ ≤ 1/f

Ejemplo 1 Hay un programa secuencial que pasa 90% de su tiempo dentro de funciones que se pueden paralelizar. Hay que hacer el otro 10% en un solo procesador. ¿Vale la pena implantar una versión paralela si hay 8 procesadores disponibles? ψ ≤ 1/(f+(1-f)/p)=1/(.1 + (1-.1)/8) = 4.7 El máximo speedup posible es lim p →∞ 1/(.1 + (1-.1)/p) = 10

Pop Quiz A computer animation program generates a feature movie frame-by-frame. Each frame can be generated independently and is output to its own file. If it takes 99 seconds to render a frame and 1 second to output it, how much speedup can be achieved by rendering the movie on 100 processors?