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

Documentos relacionados
Sincronización de Threads

Estándares POSIX. Estándares base

Analista Universitario en Sistemas. Sistemas Operativos. Instituto Politécnico Superior THREADS

1 Primitivas básicas de OpenMP

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

Sistemas Complejos en Máquinas Paralelas

Sincronización de Hilos POSIX

Taller de Programación Paralela

Hilos de ejecución POSIX

Es una API (Aplication Program Interface) que se usa para paralelismo basado en hilos múltiples en entornos de memoria compartida

PROGRAMACIÓN MULTITHREADING

Taller de Programación Paralela

PROBLEMAS TEMA 1: Estructuras de interconexión de un computador

Plataformas de Tiempo Real

Arquitectura de Computadores: Exámenes y Controles

T5-multithreading. Indice

Escalabilidad: El desempeño del software y hardware debe ser eficiente desde un grupo pequeño de procesadores a un grupo muy grande de procesadores.

Introducción a Sistemas Operativos: Concurrencia

Ejercicios Jerarquía de Memoria

#define MAX 1024 void escala_vect (float A[MAX], float B[MAX], float k) { int i; for (i=0; i < MAX; i++) B[i]=k*A[i]; }

Threads. Hilos - Lightweight process - Procesos ligeros

Ejercicios de jerarquía de memoria

2EMHWLYRV 5HIHUHQFLDV. Procesadores vectoriales

ESTRUCTURAS. Struct Identificador_ tipo_estructura { Tipo miembro_1; /*Declaración de los miembros*/

Si un candado mutex es usado por hilos en el mismo proceso pero no por hilos en diferentes procesos, los primeros dos pasos pueden simplificarse a:

Boletín de ejercicios 2.2 Ejercicios sobre gestión básica de hilos

Aspectos avanzados de arquitectura de computadoras Multiprocesadores (II) Facultad de Ingeniería - Universidad de la República Curso 2016

Arquitectura e Ingeniería de Computadores. Examen Parcial. 7/02/2012

Ejercicio 1. Teoría [2,5 puntos]:

SISTEMAS OPERATIVOS: PROCESOS. Hilos y Procesos

Sucesos asíncronos. dit. dit. Juan Antonio de la Puente DIT/UPM UPM UPM

ARQUITECTURAS PARALELAS examen de febrero de 2004

Arquitectura de Computadores Problemas (hoja 4). Curso

Cómputo paralelo con openmp y C

CLUSTER FING: ARQUITECTURA Y APLICACIONES

Jerarquía de memoria y memoria caché Ejercicios resueltos

Arquitecturas Paralelas Examen de Febrero 24 Enero 2005

Programación Concurrente

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

Paradigma de paso de mensajes

Message Passing Interface (MPI)

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GIC. PRÁCTICA 9 Departamento de Arquitectura y Tecnología de Computadores Universidad de Sevilla

Sistemas Operativos Práctica 3

Computación Matricial y Paralela

SISTEMAS OPERATIVOS:

Punteros. Programación en C 1

Ejercicios del tema 5. Jerarquía de de Memoria

COMPARACIÓN DE MODELOS DE SINCRONIZACIÓN EN PROGRAMACIÓN PARALELA SOBRE CLUSTER DE MULTICORES

Ejercicios sobre tuberías

Tipos Recursivos de Datos

TIPOS DE DATOS BASICOS EN LENGUAJE C

Threads en Linux. Definición de thread. Thread implementado en Linux. Creando un thread en Linux. Ing. Marcelo Doallo Threads en Linux 1/9

TEMA 1. INTRODUCCIÓN A LA PROGR. DISTRIBUIDA Y PARALELA

Programación I Funciones

Programación Concurrente

Sistemas Operativos Primer Recuperatorio Parcial 1

Organización lógica Identificación de bloque

TEORÍA (5 puntos) Puntuación: Desplazamiento

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

Soluciones a ejercicios de jerarquía de memoria

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

Escuela Politécnica Superior de Elche

Arquitectura de Computadoras para Ingeniería

Programación de Sistemas de Tiempo Real

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

Concurrencia Condiciones de Carrera. Guillermo Román Díez

ESTRUCTURAS DINÁMICAS DE DATOS (COLAS) EN C

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

ENTRADA-SALIDA. 2. Dispositivos de Carácter: Envía o recibe un flujo de caracteres No es direccionable, no tiene operación de búsqueda

Tema 4 El paradigma cliente-servidor

6. Entrada y Salida Explicación de la interfaz entre el computador y el mundo exterior.

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

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

ARQUITECTURAS PARA PROCESAMIENTO PARALELO

Indice 1. Introducción al procesamiento paralelo 2. Estructura de los multiprocesadores de memoria compartida

Guía N 3 Entregar como tarea problemas 5, 8, y 11 Algunos problemas pueden quedar fuera porque el tema no fue visto en clases.

utilizar libros ni un ejemplo tráfico

Modelos de computadores paralelos

ARQUITECTURA DE LOS SUBSISTEMAS DE BUSES Y ENTRADA/SALIDA

Aquesta segona part de l examen consta de 2 fulls. Heu de contestar en la mateixa fulla on es troba la pregunta.

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA GRADO EN INGENIERÍA INFORMÁTICA. ESTRUCTURA DE COMPUTADORES

Apuntadores (Punteros)

Sistemas Operativos Tema 2: Estructura del computador José Miguel Santos Alexis Quesada Francisco Santana

Práctica 8: Barreras

Sistemas Operativos II Junio 2006 Nombre:

REDES DE DATOS Modelo OSI. Angélica Flórez Abril, MSc.

Tecnólogo Informático San José Redes de Computadoras Solución Segundo Parcial 2014

Multiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas

Programación Concurrente y Paralela. Unidad 1 Introducción

Práctica 1 - Rendimiento *

Examen Fundamentos de Programación 15 de enero de 2016 Curso 2015/16

Nombre y apellidos: DNI: 1

Soluciones a ejercicios de multiprocesadores

Memoria compartida simétrica

Soluciones a ejercicios de paralelismo y concurrencia

El lenguaje de Programación C. Fernando J. Pereda

Dobles: Es el caso de la instrucción if-else (punto 1.2).

Introducción a Sistemas Operativos: Ficheros

Fundamentos de la programación

INTRODUCCIÓN A LAS REDES DE ORDENADORES

Transcripción:

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA INGENIERÍA EN INFORMÁTICA. ARQUITECTURA DE COMPUTADORES II 10 junio de 2006 Para la realización del presente examen se dispondrá de 2 horas 30 minutos. NO se podrán utilizar libros ni apuntes. Entregar cada ejercicio en hojas separadas. Problema 1. 3 Puntos. Sea un multiprocesador de memoria distribuida con las siguientes características: 8 procesadores con una potencia de 10 MFLOPS (millones de operaciones en punto flotante por segundo). Una red de topología 3D-CUBE con 8 nodos (mostrados en la figura). Cada nodo cuenta con un procesador (P), una memoria local (M), un procesador de comunicaciones (PC) y un switch de comunicaciones (S). P5 P1 P6 P7 P3 P8 S P+M PC P2 P4 La red tiene las siguientes características: o No existe restricción en el tamaño de paquete (cualquier conjunto de datos puede ser enviado en un único paquete). o Protocolo de encaminamiento del switch: store and forward. o Ancho de banda: 160 10^6 bits/seg. o Routing delay (retardo de encaminamiento del switch): 0.2 segs. o Retardo de envío y recepción del procesador de comunicaciones: 0 ms. Se desea paralelizar el siguiente lazo, donde Y es un vector de números en punto flotante de 16 bits y n=80.000.000. for ( i = 0; i < n; i++) Y[i] = Y[i] + 5; Inicialmente Y está en el procesador P1, la estrategia consiste en distribuir Y en bloques de igual tamaño entre todos los procesadores y ejecutar el lazo en paralelo. Se pide: 1. Asumiendo una distribución del vector Y en la que el procesador P1 manda sucesivamente a cada procesador la porción de Y que tiene asignada mediante un envío síncrono, es decir, no se envía un nuevo mensaje hasta que el nodo destino no recibe el dato. Calcular el tiempo de distribución de los datos. 2. Definir el diámetro de la red e indicar su valor. 3. Para la distribución por bloques del apartado anterior, calcular la máxima aceleración (speedup) alcanzable suponiendo que existe una barrera de sincronización entre la fase de distribución y la de cómputo. Asumir que el control del lazo no tiene coste. 4. Una posibilidad de mejorar la aceleración consiste en realizar comunicaciones asíncronas de modo que P1 pueda enviar de modo simultáneo distintos paquetes a través de distintos caminos de la red. Calcular la orquestación más adecuada para maximizar la aceleración asumiendo que cada switch sólo puede estar ocupado recibiendo un único paquete.

Problema 2. 2 Puntos. Dado el siguiente código de OpenMP: #pragma omp parallel shared(a,result,n) private(tmp) #pragma omp for for ( i = 0; i < n; i++) TMP = TMP + A[i]; #pragma omp critical for ( j = 0; j < n/10; j++) RESULT[j] = RESULT[j] + TMP; El tiempo de ejecución de cada iteración de cualquiera de los dos lazos es de 1ms. Se pide: 1. Se dispone de tres versiones distintas del código con valores de n diferentes (n=100, n=400 y n=800). Para cada una de ellas de quiere calcular la aceleración (speedup) teórica para los siguientes números de threads: Para la versión de n=200 con nthreads=2 Para la versión de n=400 con nthreads=4 Para la versión de n=800 con nthreads=8 2. Definir la eficiencia. Calcular la eficiencia para cada uno de los valores anteriores. 3. Es un código escalable?

Problema 3. 2 Puntos. Un computador paralelo consta de una memoria compartida que tiene 4 bloques, cada bloque consta de 4 bytes y en cada bloque hay una sola variable de tipo entero inicializada a 0. La memoria está conectada a 3 procesadores a través de un bus. Cada procesador tiene asociada una memoria caché de 2 líneas, cada línea es de 4 bytes, las cachés utilizan correspondencia directa. La siguiente figura muestra el estado inicial del sistema. MEMORIA a 0 0 a 1 0 b 0 0 b 1 0 estado bus Variable Variable y valor estado y valor estado Variable y valor CACHE 0 CACHE 1 CACHE 2 La coherencia de las memorias caché se lleva a cabo utilizando el protocolo write-once. A continuación se dan tres secuencias de acciones realizadas por los procesadores P 0, P 1 y P 2. Secuencia 1 t 0 : P 0 lee a 0 ; P 1 lee a 0 (en el tiempo 0 el proceso P 0 lee a 0 y el proceso P 1 lee a 0 ) t 1 : P 0 a 0 = 5; P 2 a 1 = 10 Secuencia 2 t 2 : P 0 a 0 = 15; P 2 a 1 = 20 Secuencia 3 t 3 : P 0 lee a 0 ; P 1 lee a 1 Secuencia 4 t 4 : P 0 lee b 0 ; P 1 lee b 0 Se pide indicar el contenido de la memoria y las tres cachés (para cada línea de cada caché muestre el estado, el nombre de la variable que contiene y el valor de la misma) después de ejecutar cada una de las secuencias de instrucciones.

Problema 4. 3 Puntos. El siguiente programa utiliza threads de POSIX y está incompleto. Hace uso de una barrera en la función trabajo y falta escribir el código de las funciones que manejan la barrera, i.e. las funciones: void init_barrera() que se encarga de inicializar las variables de la variable barrera_var. void destroy_barrera() que se encarga de destruir las variables de sincronización contenidas en la variable barrera_var. void barrera() que se encarga de suspender la ejecución de un proceso hasta tanto todos los demás lleguen a la barrera. Programe las funciones: void init_barrera() void destroy_barrera() void barrera() #include <stdio.h> #include <stdlib.h> #include <pthread.h> struct barrera_t pthread_mutex_t mutex; pthread_cond_t cond; int contador; ; void init_vector(int *a, int n); void print_a(int *a, int n); void* trabajo(void *vid); void barrera(); void init_barrera(); void destroy_barrera(); int nprocs, tamanio_a; int *a; struct barrera_t barrera_var; int main(int argc, char *argv[]) pthread_t *l_threads; int *v; if (argc!= 3) printf("uso: prueba Numero_de_Hilos Tamanio_a\n"); exit(1); nprocs = atoi(argv[1]); tamanio_a = atoi(argv[2]); if ((tamanio_a % nprocs)!= 0) printf("advertencia: parte de a no sera tratada\n"); l_threads = (pthread_t *) malloc(sizeof(pthread_t) * nprocs); a = (int *) malloc(sizeof(int) * (tamanio_a + 1)); v = (int *) malloc(sizeof(int) * nprocs); init_vector(a, tamanio_a); init_vector(v, nprocs); init_barrera();

for (i = 0; i < nprocs; i++) pthread_create(&l_threads[i], NULL, &trabajo, (void *)i); for (i = 0; i < nprocs; i++) pthread_join(l_threads[i], NULL); destroy_barrera(); print_a(a, tamanio_a); exit(0); void init_vector(int *a, int n) for (i = 0; i < n; i++) a[i] = i; a[n] = 0; void print_a(int *a, int n) for(i = 0; i < n; i++) printf("a[%d] = %d\n", i, a[i]); void* trabajo(void * vid) int id; int min, max; int s; id = (int) vid; min = id * tamanio_a / nprocs; max = min + tamanio_a / nprocs - 1; s = 0; for(i = min; i <= max + 1; i++) s += a[i]; barrera(); for(i = min; i <= max; i++) a[i] += s; void init_barrera()... void destroy_barrera()... void barrera()...

Synopsis int pthread_attr_destroy (pthread_attr_t * attr ); int pthread_attr_getdetachstate (pthread_attr_t * attr, int * detachstate ); int pthread_attr_getinheritsched (pthread_attr_t * attr, int * inherit ); int pthread_attr_getschedparam (pthread_attr_t * attr, struct sched_param * param ); int pthread_attr_getschedpolicy (pthread_attr_t * attr, int * policy ); int pthread_cond_broadcast(pthread_cond_t *cond); int pthread_cond_destroy (pthread_cond_t * cond ); int pthread_cond_init (pthread_cond_t * cond, pthread_condattr_t * attr ); int pthread_cond_signal (pthread_cond_t * cond ); int pthread_cond_timedwait (pthread_cond_t * cond, pthread_mutex_t * mutex, struct timespec * timeout ); int pthread_cond_wait (pthread_cond_t * cond, pthread_mutex_t * mutex ); int pthread_mutex_init (pthread_mutex_t * mutex, pthread_mutexattr_t * attr ); int pthread_mutex_destroy (pthread_mutex_t * mutex ); int pthread_mutex_lock (pthread_mutex_t * mutex ); int pthread_mutex_trylock (pthread_mutex_t * mutex ); int pthread_mutex_unlock (pthread_mutex_t * mutex ); int pthread_once (pthread_once_t * once_control, void (*init_routine) (void) ); pthread_t pthread_self ( ); int pthread_key_create (pthread_key_t * key, void (*destructor) () ); any_t pthread_getspecific (pthread_key_t key ); int pthread_setspecific (pthread_key_t key, any_t value ); int pthread_cleanup_push (void (*fun) (), any_t arg, cleanup_t new ); int pthread_cleanup_pop (int execute );