ARQUITECTURAS PARALELAS examen junio de 2004 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. t inicio lat. UF 1. dat N. dat LV V1, A(R1) 3 6 9+1 9+N SV B(R1), V1 [10] * 6 16 + 1 16 + N [10] * 2 12 + 1 12 + N [9 + N] ** 6 15 + N + 1 15 + 2N SUBVI V2, V1, #5 SV C(R1), V2 * ciclo de encadenamiento (V1) ** sólo hay dos buses a memoria, y los dos están ocupados en el ciclo 13 (ciclo del posible encadenamiento). Hay que esperar hasta que se libere un bus: en el ciclo 9 + N. En ese momento, el encadenamiento se efectuará leyendo V2 del banco de registros, registro que todavía se está escribiendo. TV = 15 + 2N → R(N) = N/TV (× num_oper × Frec_reloj) R(128) = 128 / 271 ciclos × 1 × 800 MHz = 379,3 Mflop/s 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 Si la latencia de la memoria es de 10 ciclos, en cada acceso se ocuparán simultáneamente 10 módulos. Por tanto, como hay 32, no es posible realizar a la vez más de 3 operaciones de memoria. El procesador tendrá, por tanto, 1, 2, o, como máximo, 3 buses. Respuesta: b 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 R∞ 200 150 100 50 0 0 50 100 150 200 Longitud de los vectores Se puede deducir de la gráfica que R∞ = 200 MF/s. Por tanto, R(N3/4) = 3/4 × 200 = 150 MF/s. Como se puede ver en la gráfica, N3/4 = 30 Respuesta: d 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 (j) (j+1) (j+2) ... = A(100+20i) ... A(6i+4) = ... → 100 + 20 i1 = 6 i2 + 4 ? Hay que aplicar el test del MCD 4 – (100) / MCD (6, 20) = –96/ 2 = –48 ∈ Z Por tanto, pueden existir dependencias. Además, las lecturas siempre van por delante lect. escr. → 100, 120, 140, ..., 2640 → 4, 10, 16, 22, ..., 766 Por tanto, existe una antidependencia entre la instrucción j y la j+2 (por ejemplo, cuando i = 0 la instrucción j lee el elemento A(100), y luego, cuando i = 16 la instrucción j+2 escribe en ese elemento). Respuesta: c 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. Por ejemplo, do i = 2, 100 (1) A(i) = B(i) + 1 (2) C(i+3) = C(i) + B(i) (3) A(i+2) = A(i-2) * 2 enddo A,2 1 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. Sí, pero sólo una parte del bucle. Tal y como está, la instrucción (2) no se puede ejecutar vectorialmente. Las instrucciones (1) y (3) sí, pero las escrituras hay que hacerlas en el orden adecuado, para respetar las dependencias de salida. A continuación se indica el código vectorial (la instrucción (2) se puede ejecutar escalarmente antes o después de este código): MOVI MOVI MOVI (1) R1, #0 VL, #99 VS, #1 LV V1, B+2(R1) ADDVI V2, V1, #1 SV A+2(R1), V2 (3) LV MULVI SV V3, A(R1) V4, V3, #2 A+4(R1), V4 (1) SV ... A+2(R1), V2 ; longitud del vector ; paso del vector ; lectura del vector B ; escritura del resultado en el vector A ;(cuidado con la dependencia de salida!) ; lectura de A ; para resolver la dependencia de salida 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. Dos procesadores utilizan variables diferentes, pero dichas variables pertenecen al mismo bloque de memoria cache. Por tanto, no se comparten variables, pero sí el bloque de cache. Es una situación no deseable. Cuando se escriba sobre esas variables se generará una señal de invalidación del bloque, y, por tanto, el bloque desaparecerá del otro procesador, a pesar de no compartir ningún dato! El siguiente acceso que realice el procesador cuyo bloque se ha invalidado será un fallo en cache (incremento de tráfico y de latencia). 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 ¡no! el resto de las copias del bloque que se remplaza no se enteran de esa operación 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 ¡no! el bloque que se va a remplazar está en estado O (modificado y es el dueño /owner) ¡hay que actualizarlo en memoria principal! d. se remplaza el bloque, pero sólo si estamos seguros de que quedan más copias en otras caches ¡no! siempre hay que salvarlo e. ninguna de las respuestas anteriores es correcta Si se remplaza un bloque en estado O, modificado, hay que actualizar la memoria principal, siempre. Respuesta: e 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é? (-) E S O S →E →S →O →S → (-) P1_rd_X P2_rd_X P1_wr_X P2_wr_X P1_rd_Z Se lee una variable cuyo bloque no está en ninguna memoria cache Otro procesador pide el bloque (por ejemplo, lectura en fallo) P1 escribe en ese bloque: se mantienen las dos copias, en P1 en estado O (bc) P2 escribe en su copia: la copia de P1 pasa a estado S (bc) Hay que cargar otro bloque en la cache y se produce un reemplazo Está claro: las copias se van actualizando según se producen modificaciones; si no, no tendríamos las transiciones S → O u O → S, sino S → M (una copia modificada, porque hemos invalidado el resto de las copias) u O → I. 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 Hasta llegar nuestro turno, estamos leyendo continuamente la variable turno, y durante ese tiempo se va a actualizar cinco veces, desde el valor 30 hasta 35. Por tanto, tendremos que traer el bloque a la cache 5 veces, ya que en cada escritura se nos va a invalidar el bloque. Respuesta: c 11. ¿Qué elementos forman, básicamente, una barrera de sincronización? ¿Qué función cumplen en la barrera? Un contador y un flag. El contador para saber cuántos procesos han llegado a ese punto de sincronización; cuando lleguen todos se abrirá la barrera. El contador hay que incrementarlo de manera atómica (dentro de una sección crítica — utilizando una variable cerrojo— o mediante una instrucción atómica del tipo fetch&increment). El flag (0/1), indica si la barrera está cerrada o abierta. 12. Brevemente ¿Cuál es la diferencia básica entre los modelos de consistencia SC (consistencia secuencial) y TSO (total store ordering)? En el modelo SC, no se pueden desordenar las lecturas y escrituras a memoria, es decir, los LD y ST. En cambio, en el modelo TSO se permite el adelantamiento de los LD frente a los ST (para ahorrar tiempo); ¡si son independientes por supuesto! 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 La permutación Perfect Shuffle es una rotación a la izquierda de un bit de la dirección. Por tanto, 24: 11000 → un bit a la izquierda → 10001 (17) Respuesta: b 14. La distancia entre los nodos 13 y 44 de un hipercubo de 6 dimensiones es: ≤ a. 1 b. 2 13 → 44: c. 4 d. 6 e. ninguna de ellas 001101 → 101100 R. E. = 001101 xor 101100 = 100001 Sólo se diferencian en dos dimensiones, la más alta y la más baja. Por tanto, la distancia es 2. Respuesta: b 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 Todas las direcciones de los nodos a distancia 2 se diferencian en 2 bits. Como tenemos direcciones de 6 bits: C 26 = 6! 6×5 = = 15 2! (6 − 2)! 2 Respuesta: d 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 Verdadero. Cuando el tráfico es elevado, la estrategia CT es más adecuada que WH puesto que los paquetes que no pueden avanzar se guardan en los encaminadores. De esa manera, no se mantienen ocupados los recursos y la red admite un tráfico más elevado. 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) Verdadero. Esta es la definición: los recursos que se tienen (o incluso más de los que se tienen) se dividen en clases y se asignan de una manera adecuada, para que el encaminamiento sea más efectivo y/o evitar bloqueos c. usar canales virtuales hace que el tiempo de routing de los paquetes sea menor, al evitarse que éstos se paren Falso. Normalmente incrementa el tiempo de routing, porque se tienen que asignar los canales virtuales (gestión de las colas, ...) d. turn model es un tipo de encaminamiento que permite encaminamiento adaptativo libre de deadlocks en una malla (pero no en un toro) Verdadero. Se prohíbe uno de los posibles giros que los paquetes pueden hacer en la red, para evitar ciclos. Pero es necesario que la topología no tenga ciclos, por ejemplo la malla. No es el caso del toro, ya que la propia topología contiene ciclos. 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) Falso. No, de ser sería al revés: se pueden transportar más paquetes si van a distancias cortas. 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 B1 = 1 Gbit/s; por tanto, para transmitir un bit se necesita 1 ns; y para un byte 8 ns. T1 = (200 + 10×128) + (5×10 + 128×8) + (200 + 10×128) = 1480 + 1074 + 1480 = 4034 ns B2 = 4 Gbit/s; por tanto, ahora se necesitan 2 ns para transmitir un byte T2 = 1480 + (5×10 + 128×2) + 1480 = 2960 + 306 = 3266 ns Por tanto, T1 / T2 = 4034 / 3266 = 1,24 Es decir, a pesar de que la transmisión es 4 veces más rápida, la generación y recepción de los paquetes limita mucho la mejora. Respuesta: b 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? En el directorio de las caches hay que añadir (por bloque) -- 2 direcciones, las de la copia anterior y siguiente → 2 × 6 = 12 bits -- 4 bits de control Total: 16 bits El número de copias no está limitado; por tanto, como máximo podrá haber una copia por procesador: 64. Además, el número de copias no tiene nada que ver con la información sobre la coherencia que se mantiene en las memorias cache. 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 se encuentra en su cache en estado (a) E; (b) S; y (c) M. (a) No hay que hacer nada, hay una única copia, la nuestra. Por tanto, E → M (b) Puede haber más de una copia, hay que avisar al directorio para que se invaliden las copias. Pi → H (direct.) (wr) estado: S → busy H → Pj, Pk, ... (inv) → Pi (número de acks) estado: S → E Pj, Pk, ... → Pi (ack) estado: busy → M (cuando han llegado todos los acks) (c) No hay que hacer nada; sólo hay una copia, la nuestra (además, modificada) 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á. Existe una dependencia de la instrucción 1 a la instrucción 2; pero esto no impide paralelizar. Existen diferentes posibilidades; por ejemplo, se puede aplicar peeling o utilizar una barrera. Si paralelizamos utilizando vectores de eventos quedaría: doacross i = 1, 200 A(i) = FUN_1 (i) post (va, i) wait (va, i-1) B(i) = FUN_2 (A(i-1)) enddoacross El factor de aceleración será alto; casi 8; ya que el coste de sincronización será bajo, con comparación con la ejecución de las dos funciones (2 s). 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. (a) es falso; el tamaño de la tarea será mayor cuando se paralelice el bucle externo (c) no; pues sólo hay 8 procesadores (d) no; se puede paralelizar sin problemas en 8 procesadores (b) es la opción correcta; Respuesta: b 22. Existen dos tipos de estrategias de scheduling dinámico. ¿En qué se diferencian entre sí? ¿Qué busca cada una de ellas? Los tipos de estrategias de planificación dinámica son: self/chunk scheduling y guided/trapezoidal scheduling. En el primer caso, los tamaños de los bucles que se reparten dinámicamente son iguales; en el segundo caso, en cambio, los trozos que se reparten son cada vez menores. El objetivo es mantener lo más equilibrado posible el trabajo entre los procesadores, manteniendo el número de operaciones de planificación lo más reducido posible.