Enunciats de problemes (Part 2) Segmentació i Paral·lelisme: Arquitectura dels Microprocessadors Actuals Professors: Eduard Ayguadé Josep Llosa Departament d’Arquitectura de Computadors Curs 2006-07 1 Problema 1 Sean las siguientes secuencias de código: mov $6, #100 ld F1, b($3) bucle: ld F2, a($2) add.f F1, F1, F2 mul.f F1, F1, F7 add $2, $2, #1 st b($2), F1 sub $6, $6, #1 bnz bucle mov $6, #100 bucle: ld F1, a($4) ld F2, b($4) add.f F3, F1, F2 st c($4), F3 add $4, $4, #1 sub $6, $6, #1 bnz bucle donde .f indica que las instrucciones operan con operandos en formato punto flotante. Suponer un procesador superescalar con las características siguientes: • ancho 2 con el mecanismo de Tomasulo, que nunca bloquea la búsqueda de instrucciones porque suponemos ilimitado el número de estaciones de reserva. El procesador busca dos instrucciones por ciclo (alineadas tal como indican las líneas) y es capaz de finalizar la ejecución y escribir resultados de dos instrucciones por ciclo (commit en orden). • tiene una unidad funcional (UF) de suma en coma flotante y una UF de multiplicación en coma flotante. Ambas están no segmentadas y sus latencias son 12 y 15 ciclos, respectivamente. La aritmética entera se realiza en otra UF con latencia 1. • para acceder a memoria se dispone de un puerto, con una latencia de 1 ciclo para el cálculo de la dirección efectiva y un ciclo para el acceso a memoria. • suponer que el procesador dispone de predicción de saltos ideal. Se pide: Indicar para cada secuencia de código si la segmentación de las unidades funcionales reduciría el tiempo de ejecución de la misma. Problema 2 Sigui el següent programa: for ( i = 1; i <= n ; i++) { if (a[i] ≠ 0) then x[i] = y[i] / a[i]; } i la seva traducció a llenguatge màquina per un processador superescalar: mov $10, #0 mov $11, #n for: ld F0, a($10) beq.f F0, #0, fin ld.f F1, y($10) div.f F2, F1, F0 st.f x($10), F2 fin: add $10, $10, #8 sub $11,$11, #1 bneq $11, #0, for ; ; ; ; ; ; ; ; ; ; $10 ← 0 $11 ← n F0 ← M[a + $10] si F0 = 0 llavors salta a fin F1 ← M[y + $10] F2 ← F1 / F0 M[x + $10] ← F2 $10 ← $10 + 8 $11 ← $11 - 1 si $11 <> 0 llavors salta a for L’arquitectura del processador superescalar es la següent: • Processador capaç d’iniciar l’execució de dues instruccions noves cada cicle. Unitats funcionals disponibles: 1 entera, 1 d’aritmètica real, 1 de memòria i 1 de salts. Segmentació amb 7 etapes (FDIEMWC) excepte les d’aritmètica real que en tenen 6 (FDIEWC). 2 • Memòria ideal (sempre fa hit i latència 1 cicle); Unitat entera amb latència 1 cicle; Unitat real segmentada amb latència 5 cicles; unitat de salts resol el salt al final de l’etapa ALU. • Predictor de salts basat amb comptador saturat de 2 bits; inicialment val zero (si el bit de més pes val zero, llavors la predicció es no saltar). La predicció es fa a l’etapa de fetch. Es demana: a) Si de les n iteracions del bucle, només les 4 primeres compleixen la condició a[i] ≠ 0, calcula la probabilitat d’encert del predictor de salt per cadascun dels salts del programa. b) Temps d’execució del programa que executa n=64 iteracions. Problema 3 Considerad un procesador superescalar de grado 4 con las siguientes características: - Etapas de la segmentación: o FDIE…EWC para las arítméticas, siendo el número de ciclos de ejecución (E) dependiente del tipo de instrucción (1 ciclo para las enteras y 4 ciclos para las operaciones de punto flotante). o FDIEMWC para las de memoria, tardando un ciclo de ejecución para el cálculo de la dirección de memoria y 1 ciclo para el acceso a la memoria (que se considerará ideal). o FDIEWC para las de salto, para las que supondremos predicción de saltos ideal (es decir, después de la etapa F siempre se sabe la dirección de la siguiente instrucción a ejecutar). - Unidades funcionales: 1 de aritmética entera, 1 de aritmética en punto flotante (segmentada) y 1 de saltos. - Puertos de acceso a memoria: 2 puertos bidireccionales con los correspondientes sumadores para el cálculo de direcciones. En las instrucciones de store, el cálculo de la dirección se realiza tan pronto como se tenga el valor del registro que se utiliza para calcular la dirección, quedando la instrucción almacenada en un buffer de escrituras a memoria en caso de no disponer del dato a escribir. - Infinitas estaciones de reserva e infinitos registros para realizar el renombre. - Permite hacer 4 writes (W) y 4 commits (C) por ciclo, realizándose los C en el mismo orden que se había hecho el correspondiente decode (D). Dado el siguiente fragmento de código en alto nivel: for (i=1; i<=max; i++) y[i] = a[i] + y[i] * x ; y su traducción a lenguaje máquina (observación: las líneas en el código indican líneas de cache, los registros $0, $1 y F3 están inicializados con anterioridad): bucle: ld F1, y($0) ld F2, a($0) mul.f F1, F1, F3 ; F3 contiene el valor de x add.f F1, F1, F2 st F1, y($0) add $0, $0, 8 sub $1, $1, 1 jnz bucle Se pide: a) ¿Cual sería el factor de proporcionalidad que multiplica al número de iteraciones (max) en la expresión que determina el tiempo de de ejecución del bucle? Para ello dibujar el cronograma de ejecución b) En régimen permanente, ¿Cuántos registros de renombre se consumen y liberan por ciclo? Para ello dibujar en el cronograma anterior los ciclos en que se consumen/liberar registros de renombre. 3 c) Si la arquitectura tuviera 32 registros de renombre, ¿en que iteración del bucle se satura este recurso? A partir de este momento, cual seria el factor de proporcionalidad que multiplica al número de iteraciones (max) en la expresión que determina el tiempo de de ejecución del bucle? Problema 4 Dado un procesador vectorial con las siguientes características: • • 8 registros vectoriales (V0-V7) de 128 elementos (MVL=128) 1 sumador y 3 multiplicadores, todas las unidades funcionales tienen un tiempo de arranque de 10 ciclos. • 1 puerto de acceso a memoria bidireccional, todas las operaciones de acceso a memoria tienen un tiempo de arranque de 15 ciclos. • La unidad de control permite lanzar una instrucción por ciclo. • Una instrucción no se puede lanzar si otra instrucción anterior está bloqueada debido a un riesgo estructural o de datos. Queremos analizar su comportamiento al ejecutar el código máquina vectorial correspondiente a: do i=1, 128 x(i) = y(i) *(s*x(i)+t*z(i)) enddo Suponed que los vectores de datos x, y, z están inicialmente en memoria (las direcciones de base están en los registros $x, $y y $z), que al final debe quedar en memoria el vector resultado x, y que los escalares s y t están en los registros $s y $t. Proponed el código máquina vectorial más eficiente que encontréis, y calculad el tiempo de ejecución (dibujar cronograma) para cada uno de los casos que se describen a continuación. a) Se permite el encadenamiento de un máximo de dos instrucciones sucesivas. Los registros disponen de un puerto de acceso bidireccional. b) Lo mismo que el apartado a), pero además se pueden encadenar cualquier número de instrucciones dependientes sucesivas. Los registros incorporan dos puertos independientes de lectura y escritura. c) Lo mismo que el apartado b), pero además se añade un segundo puerto a memoria. Problema 5 Donat el següent programa i la seva traducció a llenguatge màquina per un processador escalar i un processador vectorial: for ( i = 1; i <= n ; i++) { if (a[i] ≠ 0) then x[j] = y[i] / a[i]; } 4 CODIGO ESCALAR mov $1, n mov $2, @a mov $3, @x mov $4, @y bucle: ld.f F1, 0($2) beq.f F1, fin ld.f F2, 0($3) div.f F3, F2, F1 st.f F3, 0($4) fin: add $2, $2, #8 add $3, $3, #8 add $4, $4, #8 sub $1, $1, #1 bne $1, bucle CODIGO VECTORIAL mov $2, @A mov $3, @X mov $4, @Y ld.v V1, 0($2) sne.v V1, #0 ld.v V2, 0($3) ld.v V3, 0($4) div.v V3, V2, V1 st.v V3, 0($4) cvm Considereu dues arquitectures alternatives: • Processador superescalar capaç d’iniciar l’execució de dues instruccions per cicle amb una unitat funcional entera (latència 1 cicle), una unitat funcional de punt flotant (latència 10 cicles, segmentada) i dos unitats d’accés a memòria (latència 1 cicle). El processador incorpora predicció de salts i implementa salt amb anul·lació en cas de fer una predicció incorrecte. • Processador vectorial amb una unitat vectorial de propòsit general (suma, comparació, ..., temps d’arrancada de 4 cicles), una unitat vectorial per fer la divisió (temps d’arrancada de 10 cicles) i dos ports d’accés a memòria (temps d’arrancada de 4 cicles). La longitud vectorial màxima es de 64. S’incorporen tots els encadenaments necessaris i els registres vectorials tenen ports de lectura i escriptura independents. El processador escalar es igual al de l’arquitectura anterior i es capaç d’iniciar l’execució de dues instruccions escalars per cicle, o una escalar i una vectorial per cicle. Es demana: a) Temps mig d’execució del programa que executa n=64 iteracions en l’arquitectura superescalar. Per si us fa falta, p es la probabilitat de saltar en el salt “beqf F1, fin”. b) Ídem en l’arquitectura vectorial. Problema 6 Dado un procesador vectorial con las siguientes características: • 8 registros vectoriales (V0-V7) de 128 elementos (MVL=128). Disponen de un único puerto de acceso bidireccional. • 1 unidad funcional de suma (Tiempo de arranque 7 ciclos), 1 unidad funcional de multiplicación (Tiempo de arranque 8 ciclos) y una unidad funcional de división (Tiempo de arranque 20 ciclos). • 1 camino de acceso a memoria bidireccional. • La memoria está organizada en 16 bancos de memoria entrelazados de una palabra de ancho. Los bancos tiene un tiempo de acceso de 6 ciclos. • La unidad de control permite lanzar una instrucción por ciclo. • Encadenamiento de un máximo de dos instrucciones. • Una instrucción no se puede lanzar si otra instrucción anterior está bloqueada debido a un riesgo estructural o de datos. Queremos ejecutar el siguiente programa en alto nivel: real v(n), a(n, n) 5 do i = 1, n v(i) = (a(i, i) + a(n-i+1, i)) / b end do Dado que la matriz a está almacenada por columnas, el código vectorial (eliminando la parte escalar) podría ser el siguiente: ld.vws V0, ($1, #stride1) ld.vws V1, ($2, #stride2) add.v V2, V1 + V0 div.v V3, V2, F1 st.v $3, V3 Se pide: a) ¿Cuánto valdrían los valores stride1 y stride2 para n = 127? b) Dibujad el diagrama de tiempo de ejecución de la primera instrucción de load para n = 127. Ídem para la segunda instrucción de load suponiendo que la instrucción 1 ya ha terminado. c) Dibujad el diagrama de tiempo de ejecución de para todo el código, marcando los encadenamientos y calculad el tiempo total de ejecución para n = 128. d) Calculad el tiempo total de ejecución para n = 1000 (teniendo en cuenta el strip mining). Problema 7 Donat el següent programa: for ( i = 1; i <= n ; i++) { if (a[i] ≠ 0) then x[i] = y[i*2] / a[i*4]; } i la seva traducció a llenguatge màquina per un processador vectorial: CODI VECTORIAL mov $2, @A mov $3, @X mov $4, @Y ld.v V1, 0($2) sne.v V1, 0 ld.vws V2, 0($3), 4; amb stride i mascara ld.vws V3, 0($4), 2 div.v V3, V2, V1 st.v V3, 0($4) cvm Es demana calcular el temps mig d’execució del programa quan N=64 iteracions i amb l’arquitectura vectorial següent: • • • Processador vectorial amb una unitat vectorial de propòsit general (suma, comparació, ..., temps d’arrancada de 4 cicles), una unitat vectorial per fer la divisió (temps d’arrancada de 10 cicles) i un port d’accés a memòria (temps d’arrancada de 4 cicles). La longitud vectorial màxima es de 64. S’incorporen tots els encadenaments necessaris i els registres vectorials tenen ports de lectura i escriptura independents. Memòria organitzada en 4 mòduls. Temps d’accés a un mòdul de memòria de 4 cicles. El processador escalar es capaç d’iniciar l’execució de dues instruccions escalars per cicle, o una escalar i una vectorial per cicle. 6 Problema 8 Dado un procesador vectorial con las siguientes características: • • 8 registros vectoriales (V0-V7) de 128 elementos (MVL=128) 1 sumador y 3 multiplicadores, todas las unidades funcionales tienen un tiempo de arranque de 10 ciclos. • 1 camino de acceso a memoria bidireccional, todas las operaciones de acceso a memoria tienen un tiempo de arranque de 15 ciclos. • La unidad de control permite lanzar una instrucción por ciclo. • Una instrucción no se puede lanzar si otra instrucción anterior está bloqueada debido a un riesgo estructural o de datos. Queremos analizar su comportamiento al ejecutar el código máquina vectorial correspondiente a este bucle: do i=1, 128 x(i) = y(i) *(s*x(i)+t*z(i)) enddo Suponed que los vectores de datos X, Y, Z están inicialmente en memoria (las direcciones de base están en los registros Rx, Ry y Rz), que al final debe quedar en memoria el vector resultado X, y que los escalares s y t están en los registros Rs y Rt. Proponed el código máquina vectorial más eficiente que encontréis, y calculad el tiempo de ejecución (dibujar cronograma) para cada uno de los casos que se describen a continuación. a) No es posible ningún encadenamiento y solapamiento de instrucciones. b) Se permite solapar instrucciones. c) Lo mismo que el apartado b), pero además se puede encadenar dos (no más) instrucciones sucesivas siempre y cuando sea en forma directa (no en cualquier instante). d) Lo mismo que el apartado b), pero además se pueden encadenar cualquier número de instrucciones dependientes sucesivas, y en cualquier instante de su ejecución. e) Lo mismo que el apartado d), pero además se añade un segundo camino con memoria. Problema 9 Suposeu un sistema multiprocessador amb memòria compartida format per 8 processadors que cooperen en l’execució paral·lela del següent codi seqüencial: integer*8 a(max) /* vector amb “max” elements; cada element és un enter que ocupa 8 bytes */ for (i=0; i<max; i++) a(i) = 1.0; for (i=0; i<max-1; i++) a(i) = a(i+1) * 2.0 for (i=1; i<max-1; i++) a(i-1) = a(i) + a(i+1) / 3.0 La paral.lelització de codi consisteix en que cada processador executa (aprox. max/8) iteracions consecutives de cada bucle. Cada processador disposa de una memòria cache de 64 Kbytes (correspondència directa) i la mida de la línia (bloc) de la cache es de 64 bytes. El protocol de coherència es “escriptura i invalidació” amb “snoopy”. a) Suposant que max=1024, ¿quants bytes es transfereixen per la xarxa d’interconnexió durant l’execució de tot el programa? b) Ídem si max=32. Notes: Podeu considerar que l’execució de cada iteració dels bucles triga el mateix temps. En una comanda d’invalidació es transfereix 1 byte per la xarxa d’interconnexió. 7 Problema 10 Considereu els següents paràmetres que defineixen el temps d’execució d’un programa seqüencial i de la seva corresponent versió paral·lela: • • Fracció paral·lelitzable: f; fracció seqüencial: 1-f. Probabilitat de hit en la fracció seqüencial: hs; probabilitat de miss en la fracció seqüencial: 1hs. Aquestes probabilitats també apliquen a la versió seqüencial. Probabilitat de hit en la fracció paral·lela: hp; probabilitat de miss en la fracció seqüencial: 1hp. Temps d’accés a cache: tmc cicles; temps d’accés a memòria principal compartida: tmp cicles. P processadors, cadascun amb un CPI (suposant hit a la memòria cache): CPI. • • • Es demana: a) Trobeu l’expressió que defineix el speed-up (relació entre el temps d’execució seqüencial i el temps d’execució paral·lel) en funció dels paràmetres anteriors. b) Si hp=hs, quina es l’expressió pel speed-up? c) Com hauria d’empitjorar la probabilitat de hit hp respecte a hs (es a dir, la relació entre hp i hs) per tal d’obtenir la meitat del speed-up obtingut a l’apartat b)? . Problema 11 Es vol resoldre un sistema triangular d’equacions utilitzant un sistema multiprocessador. El sistema triangular es pot expressar com: a 11 0 0 0 a 21 a 22 0 0 a 31 a 32 a 33 0 a 41 a 42 a 43 a44 b1 x1 × x2 x3 = x4 b2 b3 b4 on les incògnites a trobar es el vector [x1, x2, x3, x4]. Alhora de programar-lo en paral·lel, el problema el podem rescriure tal com es mostra a continuació: x1 b2 b3 b4 = = = = b1 b2 b3 b4 / - a11 a21 • x1; x2 = b2 / a22 a31 • x1; b3 = b3 - a32 • x2; x3 = b3 / a33 a41 • x1; b4 = b4 - a42 • x2; b4 = b4 - a43 • x3; x4 = b4 / a44 on podeu observar que el vector [b1, b2, b3, b4] del sistema es perd. Aquest plantejament suggereix una possible implementació paral·lela del problema (plantejat pel cas general d’un sistema de N equacions amb N incògnites): doall (i=1; i<=N; i++) { doall (j=1; j<=i-1; j++) b(i) = b(i) - a(i, j) • x(j) x(i) = b(i) / a(i, i) } Es demana: a) Suposeu que el sistema multiprocessador consta de N processadors amb memòria compartida. El bucle "doall" assigna iteracions consecutives a processadors consecutius. Afegir la sincronització necessària per tal de garantir que el resultat de l’algorisme és correcte. b) Si el sistema multiprocessador té memòria distribuïda, de manera que cada processador 8 guarda a la seva memòria local una fila de la matriu a, i un element dels vectors x i b. La topologia de la xarxa es linial, es a dir, un processador p només es pot comunicar amb els seus veïns p-1 i p+1. Afegir la comunicació necessària mitjançant pas de missatges. Notes: Podeu utilitzar les primitives de sincronització i pas de missatges següents: wait (semafor) signal (semafor) suposant que el hardware ofereix vectors de semàfors semafor(1:P). D’aquests vectors n’hi ha tants com necessaris. send (val, port) receive (val, port) on port={dreta | esquerra} indica cap on s’envia la dada val. 9