Universidad del País Vasco Facultad de Informática Dpto. de Arquitectura y Tecnología de Computadores Arquitecturas Paralelas Examen de Junio 16 – Junio – 2004 Apellidos: Grupo: Nombre: Firma: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Ejercicio B El examen consta de dos partes, A y B. En la primera se trabajan conceptos básicos de la asignatura, y en la segunda se plantea un problema más largo. Evaluada cada parte en 10 puntos, la nota del examen será la mejor de: - considerando todo el examen 0,7 A + 0,3 B - considerando sólo la primera parte 0,8 A En todo caso, es necesario sacar más de 3 puntos de 10 en la parte A para aprobar la asignatura. Parte A 22 cuestiones — 2,5 horas — 7 puntos (u 8) Se trata de resolver las cuestiones que se plantean y, en su caso, escoger la respuesta adecuada de entre las que se ofrecen (rodear con un círculo). Utiliza para la respuesta el espacio asignado a cada pregunta; aunque no es necesario, si necesitas más, utiliza la parte trasera de la hoja. En todo caso, las respuestas deben ser precisas. Las preguntas valen 1 (cursiva) o 2 (negrita) puntos. En total, son 29 puntos. Las respuestas equivocadas no quitan puntos, pero sólo se tomarán en consideración las que provengan de una determinado cálculo o razonamiento. En general, las respuestas se considerarán sólo como bien o mal. 1. La siguiente tabla muestra un resumen de la ejecución de un programa en un procesador vectorial. Completa la tabla teniendo en cuenta las siguientes características de la máquina: las instrucciones se encadenan; existen 2 buses a memoria; no hay conflictos en el acceso a los módulos de memoria; el paso (stride) de los vectores es 1; y la frecuencia del reloj es 0,8 GHz. Calcula el rendimiento (MF/s) que se obtendrá con vectores de 128 elementos. LV SV SUBVI SV V1, A(R1) B(R1), V1 V2, V1, #5 C(R1), V2 t inicio lat. UF. 3 6 1. dat N. dat 2 2. Un procesador vectorial utiliza una memoria entrelazada en 32 módulos y con una latencia de 10 ciclos. Podríamos esperar que el procesador dispusiera del siguiente número de buses para acceder a memoria: a. en el mejor de los casos, 10, uno por cada ciclo de latencia b. 1, 2 o 3 c. al menos 2: uno para lecturas (LV) y otro para escrituras (SV) d. si las instrucciones no se encadenan, bastaría con 1 bus; si se encadenan, al menos 2 e. ninguna de las respuestas anteriores es correcta 3. De acuerdo a los datos del gráfico, que representa el rendimiento obtenido en la ejecución de un programa en una máquina vectorial en función de la longitud de los vectores, ¿cuál es el valor de N3/4 para ese programa? a. sólo se puede decir que N3/4 es mayor que 200 b. N3/4 no se puede obtener de la gráfica; el valor más pequeño que se puede obtener es N5 c. 150 d. 30 e. ninguna de las respuestas anteriores es correcta 200 150 100 50 0 0 50 100 150 Longitud de los vectores 200 4. En un determinado bucle escalar, cuyos límites son i = 0 e i = 127, la instrucción j lee en A(100+20i), y la instrucción j+2 escribe A(6i+4). Por ello, tras aplicar el test de dependencias, se puede decir que: a. existe una dependencia de datos (RD) de la instrucción j a la j+2 b. existe una dependencia de datos (RD) de la instrucción j a la j+2, pero fuera de los límites del bucle c. existe una antidependencia (DR) de la instrucción j a la j+2 d. existe una antidependencia (DR) de la instrucción j+2 a la j e. no hay dependencia entre las dos instrucciones 5. El grafo de la figura representa las dependencias de un determinado bucle. Escribe un bucle escalar, lo más sencillo posible, que sea compatible con dicho grafo. 1 A,2 2 A,2 C,3 3 6. Indica si es posible vectorizar el bucle anterior y por qué. En su caso, escribe el código vectorial correspondiente, completo. 7. Explica brevemente en qué consiste el problema conocido como “falsa compartición” y qué efectos puede tener, positivos o negativos, en un sistema paralelo de memoria compartida. 8. Debido a una operación de escritura en cache, va a ser necesario remplazar un bloque en estado O. Por tanto: a. hay que invalidar el resto de copias del bloque que se va a reemplazar, que estarían en estado S b. el caso que se plantea no es posible, ya que, si ha sido un acierto en la cache, se escribe sin remplazar c. se remplaza sin más el bloque, ya que quedarán más copias del mismo en otras caches d. se remplaza el bloque, pero sólo si estamos seguros de que quedan más copias en otras caches e. ninguna de las respuestas anteriores es correcta 9. Un bloque de datos pasa por los siguientes estados en una cache de un multiprocesador SMP: (-) → E → S → O → S → (-). Indica las acciones que se van produciendo para que se efectúe esa secuencia de estados (p.e. P1-wr-X). ¿Qué tipo de protocolo de coherencia se está utilizando, invalidación o actualización? ¿Por qué? 10. La entrada a una sección crítica está controlada por una función de lock que utiliza el método de los tickets/turno. Un proceso ejecuta dicha función y obtiene un ticket de valor 35. El valor del turno en ese momento es 30. Mientras espera su turno de entrada a la sección crítica, ¿cuántas veces necesitará ese proceso que se le transfiera a la cache el bloque de datos que contiene la variable turno? a. sólo una, la última vez antes de entrar b. antes de entrar, ninguna; sólo cuando abandone la sección crítica, para incrementar la variable turno c. 5 veces, el número de incrementos que hay que hacer en la variable turno hasta que le llegue su turno d. sólo una, la primera vez que intenta acceder a la sección crítica e. las respuestas anteriores son falsas; turno es una variable compartida, y por tanto “visible” para todos 11. ¿Qué elementos forman, básicamente, una barrera de sincronización? ¿Para qué se utilizan? 12. Brevemente ¿Cuál es la diferencia básica entre los modelos de consistencia SC (consistencia secuencial) y TSO (total store ordering)? 13. Un patrón de comunicación tipo perfect shuffle comunica el nodo 24 de una red Omega de 32 procesadores con el nodo: a. 3 (00011) b. 17 (10001) c. 7 (00111) d. 28 (11100) e. ninguno de ellas 14. La distancia entre los nodos 13 y 44 de un hipercubo de 6 dimensiones es: ≤ a. 1 b. 2 c. 4 d. 6 e. ninguna de ellas 15. ¿Cuántos nodos tiene el nodo 13 del hipercubo anterior a esa misma distancia? ≤ a. 6 b. 1 c. 12 d. 15 e. ninguna de ellas 16. ¿Verdadero o falso? ¿Por qué? a. con tráfico aleatorio, el nivel de tráfico con el que se satura la red de comunicación de un multicomputador es mayor si el encaminamiento es CT que si es WH b. incluir canales virtuales en un encaminador significa repartir en diferentes colas los búferes de paquetes, una cola por canal virtual (y tal vez añadir más) c. usar canales virtuales hace que el tiempo de routing de los paquetes sea menor, al evitarse que éstos se paren d. turn model es un tipo de encaminamiento que permite encaminamiento adaptativo libre de deadlocks en una malla (pero no en un toro) e. el número de paquetes que puede gestionar la red sin saturarse es directamente proporcional a la distancia media que recorren (crece con la distancia) 17. El sistema de comunicación de un multicomputador emplea los siguientes tiempos (en ns) para enviar un paquete de L = 128 bytes, a distancia d = 10, siendo el ancho de banda de los enlaces B = 1 Gbit/s: generación del paquete → 200 + 10×L /* L en bytes */ transmisión del paquete → 5×d + L/B recepción del paquete → 200 + 10×L Si mejoramos la velocidad de transmisión de los enlaces hasta 4 Gbit/s, ¿cuántas veces más rápida será la comunicación emisor/receptor? Analiza el porqué del resultado que obtengas. a. 4×L b. 1,24 c. 3,5 d. 0,7 e. ninguna de ellas 18. Un sistema MPP de 64 nodos utiliza un protocolo de coherencia tipo NUMA-Q, con listas encadenadas de las copias en las caches y 4 bits de estado. ¿Cuánta información hay que añadir por cada bloque de cache en cada procesador para mantener la coherencia? ¿Cuál es el máximo número de copias de un bloque que se admite en el sistema? ¿En cuánto se reduciría la información de control de coherencia por cada bloque de cache si redujéramos el número de copias admitidas a la mitad? 19. Indica breve y esquemáticamente las acciones a realizar para mantener la coherencia en una máquina tipo Origin 2000 cuando un procesador escribe en un bloque que está en su cache en estado (a) E; (b) S; y (c) M. 20. Una determinada aplicación ejecuta el siguiente bucle, en el que el tiempo de ejecución de cada función viene a ser de 1 segundo: do i = 1, 200 (1) A(i) = FUNC1(i) (2) B(i) = FUNC2(A(i-1)) enddo Se quiere ejecutar el bucle en un sistema paralelo SMP de 8 procesadores. ¿Es posible hacerlo de manera eficiente? Si no lo es, explica por qué. Si es posible, escribe el correspondiente código (si hay que sincronizar, utiliza vectores de eventos). Caso de que pueda ejecutarse en paralelo, haz una estimación del speed-up que se conseguirá. 21. Un determinado bucle de 3 dimensiones puede paralelizarse en cualquiera de ellas sin necesidad de sincronización, y se va a ejecutar en una máquina SMP de 8 procesadores. Lo más adecuado sería: a. paralelizar el bucle interno, para que el tamaño de grano sea grande b. paralelizar el bucle externo, para que las tareas que ejecute cada procesador sean grandes c. paralelizar los tres bucles, para tener muchas tareas independientes que asignar a cada procesador d. ejecutar en serie, porque son pocos procesadores para un bucle de 3 dimensiones e. las respuestas anteriores son correctas, y la solución más adecuada va a depender del protocolo de coherencia de cache que utilice el multiprocesador: invalidación o actualización. 22. Existen dos tipos de estrategias de scheduling dinámico. ¿En qué se diferencian entre sí? ¿Qué busca cada una de ellas? Parte B 1 h — 3 puntos Un computador paralelo de memoria distribuida privada está compuesto por 64 procesadores conectados mediante una red en forma de toro de 2 dimensiones, con enlaces de 4 Gbit/s. El tiempo de procesado de los paquetes en los encaminadores de la red es de 5 ns. Los paquetes son de 1+31 bytes (=flits). 1. (a) Se envía un paquete a un nodo a distancia máxima en la red. Calcula el tiempo de transmisión del paquete si la comunicación se efectúa en modo cut-through. (b) Una determinada aplicación que se está ejecutando en esta máquina sólo efectúa comunicación con los nodos vecinos, con probabilidad P = 0,7, y con los nodos a distancia máxima, con probabilidad P = 0,3. Calcula la distancia media recorrida por los paquetes de dicha aplicación. 2. (c) Finalmente, calcula el máximo número de paquetes por segundo que es capaz de absorber la red de esta máquina en condiciones de tráfico aleatorio (en espacio y tiempo). La siguiente función efectúa una determinada operación con los elementos de un vector. Se trata de un cálculo que es fácil de ejecutar en paralelo. En concreto, se va a ejecutar en la máquina anterior, en la que la memoria de cada nodo es privada, por lo que todas las variables son privadas y la comunicación se debe efectuar mediante operaciones explícitas de paso de mensajes. La comunicación se efectúa cuando dos procesadores, emisor y receptor, ejecutan las funciones ENVIAR(dir_dat, num_elem, destino) y RECIBIR(dir_dat, num_elem, origen). double func_A () { int i, lvec; double res, sum=0.0; printf("\n long_vect? "); scanf("%d", &lvec); for (i=0; i<lvec; i++) sum = sum + A[i]*A[i]/ (A[i]+2.5) res = sqrt(sum) / lvec; return res; } Los procesos se identifican mediante la variable pid. Uno de los procesos (p.e. pid=0) lee la longitud del vector y reparte al resto de procesos, uno a uno, un trozo del vector A. A continuación, cada proceso ejecuta localmente el correspondiente código, y, al finalizar, envía a pid=0 el resultado parcial obtenido, quien efectuará el cálculo final. En resumen: un proceso se encarga de repartir datos y recoger y acumular resultados parciales y el resto efectúa el cálculo. El código paralelo podría ser el siguiente: double func_A () { int i, lvec, nproc=64; double res, sum=0.0, sum_aux=0.0; // longitud del vector y num. de proc. ...................................................................................................... if (pid==0) { printf("\n long_vect? "); scanf("%d", &lvec); tam = lvec / (nproc – 1); // el pr. 0 // lee el tamaño del vector // tamaño de cada trozo de vector for (i=1; i<nproc; i++) ENVIAR(&A[tam*(i-1)], tam, i); // envia trozos del vector, uno a uno } else RECIBIR(A, tam, 0); // el resto espera recibir datos ...................................................................................................... BARRERA(nproc); // sincronización global antes del cálculo if (pid==0) { sum = sum_aux; for (i=1; i<nproc; i++) { RECIBIR (&sum_aux, 1, i); sum = sum + sum_aux; } res = sqrt(sum) / lvec; return res; } else { for (i=0; i<tam; i++) sum_aux = sum_aux + A[i]*A[i] / (A[i]+2.5); ENVIAR(&sum_aux, 1, 0); } // pr. 0 recibe y acumula resultados parciales ...................................................................................................... // cálculo final // cálculo local en el resto de procesadores // se envian al pr. 0 los resultados parciales ...................................................................................................... } (a) Se trata de obtener una estimación del speed-up que se puede conseguir al ejecutar este bucle en los 64 procesadores, para un vector de 63 × 105 elementos. Para simplificar el cálculo, vamos a efectuar las siguientes hipótesis de tiempos (en ns): - una iteración del bucle for de cálculo ...................................... 500 - una operación de comunicación <ENVIAR/RECIBIR> ....... 10.000 + 2 × L - una operación de sincronización global..................................... 6.000 (b) ¿Es necesario utilizar en el código anterior la función de sincronización global BARRERA? ¿En qué mejoraría o empeoraría el resultado si no se utilizara? Para razonar tus argumentos, representa en un gráfico (similar a los que hemos utilizado para analizar el comportamiento de las instrucciones T&S, LL/SC, ...) cómo se va efectuando la comunicación y el cálculo a lo largo del tiempo para el caso de 5 (1+4) procesadores. (c) Durante el curso hemos visto cómo se implementa una barrera en un sistema de memoria compartida. 3. ¿Podrías esbozar cuál sería la implementación de una barrera de sincronización global en un sistema de memoria privada? Cambiamos ahora de máquina, ya que vamos a ejecutar el programa anterior en una máquina de memoria compartida tipo SMP: 8 procesadores en un bus. Escribe el código de los procesos que se ejecutarán en cada nodo para efectuar el cálculo en paralelo. Utiliza las funciones de sincronización y las variables que consideres necesarias; en todo caso, indica claramente el ámbito de las variables, global o local. 4. Para efectuar el cálculo en paralelo, se han repartido trozos de vector a cada procesador de a cuerdo a una determinada política de scheduling. ¿Qué tipo de scheduling se ha utilizado en programa del apartado 2? Retoma el código escrito para la maquina de memoria común del apartado 3 y rescribe la planificación del bucle de cálculo utilizando el “otro” tipo de política, en la versión que prefieras. ¿Cuál consideras que es la estrategia de reparto más adecuada para este caso? ¿Por qué?