AIC – P9-10 Barreras en Multiprocesadores. Objetivo Programar el acceso a variables compartidas en multiprocesadores Uso de cerrojos en el acceso a las.

Slides:



Advertisements
Presentaciones similares
Arreglos.
Advertisements

GESTION DE PROCESOS.
AIC-P81 AIC – P8 Introducción al simulador LIMES.
ESTRUCTURA DE DATOS Unidad 01 MATRICES.
Clases en C++.
Tablas. Descripción general Introducción a las tablas Creación de tablas Uso de tablas.
PROGRAMACIÓN ESTRUCTURADA EN PSEUDÓCODIGO
T5-multithreading SO-Grado Q1.
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
Fundamentos de la Programación Estructurada
Programación I Teoría III
Estructuras de datos. Programación, Algoritmos y Estructuras de Datos.
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
Sintaxis básica del lenguaje
INFORMATICA I Arreglos 1 CLASE 17.
Informática II Prof. Dr. Gustavo Patiño MJ
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Programación con restricciones
Estructuras de Repetición
¿Para qué se utiliza el PSEINT?
Vectores en java.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
FUNCIONES EN C.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
El lenguaje de programación C - Funciones -
Métodos Algoritmos y Desarrollo de Programas I. Cuando utilizar métodos  Los métodos se utilizan para romper un problema en pedazos de forma que este.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA OCHO THREADS.
Programación de código reubicable
Conceptos generales: Concurrencia: Existencia simultánea de varios procesos en ejecución. IMPORTANTE: EXISTENCIA SIMULTÁNEA NO IMPLICA EJECUCIÓN SIMULTÁNEA.
FUNCIONES EN C.
Ing Florencia Ferrigno Tecnicas Digitales 3
Estructura de un programa en C
Unidad III Administración de procesos
Aplicado a programas openMP
Elaborado por Fernando Torre - Universidad Simón Bolívar ARREGLOS CI Computación I Universidad Simón Bolívar Dpto. de Computación y Tecnología de.
ESTRUCTURA DE DATOS EN JAVA
Programación de Memoria Compartida
Clase 10: Estructuras de datos y arreglos.
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
Programación de Memoria Compartida
METODOLOGÍA DE LA PROGRAMACIÓN
Tipo de Datos Básicos.
Tema 10.3: Asignación de Espacio No Contiguo. Tema 10.3: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.),
Asignación de Espacio No Contiguo
Informática Ingeniería en Electrónica y Automática Industrial
Material de apoyo Unidad 4 Estructura de datos
El lenguaje de programación C - Vectores y matrices -
 El acceso concurrente a datos compartidos puede dar pie a inconsistencia de datos  Mantener la consistencia de los datos requiere mecanismos para asegurar.
OpenMP C and C++ Application Program Interface. Version October 1998.
Introducción a los Sistemas Operativos
Sincronización de Procesos Conceptos Problema SC Soluciones Software Soluciones Hardware Emely Arráiz Ene-Mar 08.
Unidad II Introducción a la programación en C++
LENGUAJE “C” Programación. Condicionales Los condicionales permiten al programa escoger entre varios posibles resultados dependiendo de la evaluación.
Programación Orientada a Objetos
Teoría de Sistemas Operativos Sincronización Procesos
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings

Fundamentos de Programación
Al finalizar el curso el alumno será capaz de: Diseñar algoritmos utilizando estructuras estáticas de datos y programación modular.
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
También es conocido como proceso ligero. Es una entidad básica de utilización de CPU y esta formado por un contador de programa, algunos registros y una.
MEMORIA DINÁMICA.
Desarrollador Profesional de Juegos Programación III Unidad II introducción a Mutex Secciones críticas.
PROGRAMACIÓN Grupo de Modelamiento de Sistemas
Primeras versiones Windows N.T Server 3.1, 3.5, 3.51, 4.0 Versiones mas actuales Windows Server 2000, 2003, Small Business, Home server, 2008, 2012.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
Transcripción de la presentación:

AIC – P9-10 Barreras en Multiprocesadores

Objetivo Programar el acceso a variables compartidas en multiprocesadores Uso de cerrojos en el acceso a las variables Problema de la falsa compartición (false sharing) Desarrollo de códigos paralelos

Macros ANL - Generales Permite la creación de varios Hilos CREATE(nombre_funcion)CREATE(nombre_funcion) Crea un hilo que ejcuta una función. WAIT_FOR_END(numero)WAIT_FOR_END(numero) Espera hasta que acaben los hijos antes de entrar en otr a sección temporal. CLOCK(variable)CLOCK(variable) Tiempo. Lo usaremos para medir el rendimiento.

Macros ANL - Cerrojos LOCKDEC(nombre_cerrojo)LOCKDEC(nombre_cerrojo) declara un cerrojo con el nombre nombre_cerrojo. LOCKINIT(nombre_cerrojo)LOCKINIT(nombre_cerrojo) inicializa nombre_cerrojo a un estado libre. macro antes de lanzar ningún otro proceso. LOCK(nombre_cerrojo)LOCK(nombre_cerrojo) toma posesión del cerrojo nombre_cerrojo. La ejecución se para hasta que se consigue el cerrojo. UNLOCK(nombre_cerrojo)UNLOCK(nombre_cerrojo) libera el cerrojo para que otros lo puedan adquirir.

Macros ANL – Barreras ALOCKDEC(nombre_cerrojo,tamaño_vector)ALOCKDEC(nombre_cerrojo,tamaño_vector) cerrojo con el nombre nombre_cerrojo. Protege a un vector de tamaño tamaño_vector. ALOCKINIT(nombre_cerrojo,tamaño_vector)ALOCKINIT(nombre_cerrojo,tamaño_vector) inicializa el cerrojo nombre_cerrojo a un estado libre. Este cerrojo protege a un vector de tamaño tamaño_vector. ALOCK(nombre_cerrojo,elemento)ALOCK(nombre_cerrojo,elemento) toma posesión del cerrojo nombre_cerrojo que protege al elemento elemento de un vector. La ejecución se para aquí hasta que se consigue el cerrojo. AULOCK(nombre_cerrojo,elemento)AULOCK(nombre_cerrojo,elemento) libera el cerrojo para que otros lo puedan adquirir.

Makefile y variables de entorno Abrimos sesión en limes, ssh –X limes Creamos un directorio para nuestra aplicación y bajamos el código de ejemplo mkdir barrera_1 wget Copiamos un makefile para modificarlo cp $LIMESDIR/applications/fft/makefile. Usando un editor, cambiamos TARGET y las variables APPCS Nota: Para usar vi comodamente, copiar el archivo wget

Barreras Sense-Reversing Partimos de una matriz de 4 filas y n columnas (n procesadores) Se realizan 4 iteraciones Primera Iteración: se rellena la primera fila con el número de cada procesador columna anteriorResto: se asigna a cada elemento de la fila i el elemento de la fila i-1 pero de la columna anterior Al final de cada iteracción hay que poner una barrera

Barreras Sense-Reversing Al final del programa, sacamos por pantalla el resultado. Implementación de barrera simple Lanzar el algoritmo usando barrera y sin usarla. Visto en teoría Programamos en C, compilamos con gcc usando el makefile

/* Programa de ejemplo */ #include #define LONGIT /* Longitud del vector */ #define PROC_MAX 64 /* Numero de procesadores */ MAIN_ENV /* No es necesario con Limes */ unsigned int inicio,final; double vector[LONGIT]; /* Vector compartido*/ int PrId; /* Identificador de proceso */ LOCKDEC(PrIdLock) /* Cerrojo para la variable anterior */ Barreras – Código I

Barreras – Código II /* Este es la rutina ejecutada por cada hilo lanzado */ void Proceso(void) { int i,trozo,pr; LOCK(PrIdLock); pr=PrId; /* Cada identificador debe ser unico */ PrId++; /* por eso se protege con un cerrojo */ UNLOCK(PrIdLock); trozo=LONGIT/PROC_MAX; for (i=trozo*pr;(i<trozo*(pr+1)) && (i<LONGIT) ;i++) /* Consecutivo */ /*for (i=pr;i<LONGIT;i=i+PROC_MAX)*/ /* Entrelazado */ { vector[i]=M_PI; /* valor de pi */ vector[i]=sqrt(vector[i]); /* Gastamos tiempo */ }

Barreras – Código III main() { int i; MAIN_INITENV(); /* Inicio de la parte principal */ memsim_init(); /* Inicia la memoria del simulador */ CLOCK(inicio); /* tomamos cuenta del tiempo inicial*/ PrId=0; /* El padre es el proceso # 0 */ LOCKINIT(PrIdLock); /* Inicializa cerrojo */ for (i=1;i<PROC_MAX;i++) { CREATE(Proceso); /* Este bucle lanza PROC_MAX-1 hilos*/ } Proceso(); /* El padre tambien hace su faena */ WAIT_FOR_END(PROC_MAX-1); /* Esperamos a los hijos */ CLOCK(final); /* Medimos el tiempo al terminar */ printf("%14ld\n",final-inicio); MAIN_END; /* Fin de la parte principal */ }

Barreras en árbol Más difícil de implementar Más eficiente Procesadores hoja Proceso raíz

Barreras en árbol - Implementación Seudo-algoritmoSeudo-algoritmo Al inicio cada proceso pone su contador y su variable de liberación a cero. Cuando un proceso hoja (sin hijos) entra en la barrera debe incrementar el contador de su padre y se espera hasta la liberación. Cuando un proceso con hijos entra en la barrera se espera a que su contador alcance el número de hijos que tiene. Cuando el contador de un proceso con hijos alcanza el número de hijos que tiene, entonces incrementa el contador de su padre, pone el suyo propio a cero y se espera hasta que sea liberado. Cuando el contador del proceso raíz (proceso 1) es igual al número de hijos que tiene, entonces pone a uno la variable de liberación de cada uno de sus hijos saliendo de la barrera. Cuando un proceso detecta que su variable de liberación está a uno, pone a cero la suya y a uno la de sus hijos saliendo de la barrera.