La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "AIC – P9-10 Barreras en Multiprocesadores. Objetivo Programar el acceso a variables compartidas en multiprocesadores Uso de cerrojos en el acceso a las."— Transcripción de la presentación:

1 AIC – P9-10 Barreras en Multiprocesadores

2 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

3 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.

4 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.

5 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.

6 Makefile y variables de entorno Abrimos sesión en limes, alumno@maquina:~> ssh –X limes Creamos un directorio para nuestra aplicación y bajamos el código de ejemplo alumno@limes:~> mkdir barrera_1 alumno@limes:~/barrera_1> wget http://informatica.uv.es/docencia/iiguia/asignatu/2000/AC/lab/ejemplo.c Copiamos un makefile para modificarlo alumno@limes:~/barrera_1> cp $LIMESDIR/applications/fft/makefile. Usando un editor, cambiamos TARGET y las variables APPCS Nota: Para usar vi comodamente, copiar el archivo alumno@limes:~> wget www.uv.es/serhocal/.vimrc

7 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

8 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

9 /* Programa de ejemplo */ #include #define LONGIT 10000 /* 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

10 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 */ }

11 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 */ }

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

13 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.


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

Presentaciones similares


Anuncios Google