Segmentación
Segmentación
Segmentación
1 (Ejercicios de clase)
Un circuito que implementaba una operación en T op=450 ns. se ha segmentado mediante
un cauce lineal con cuatro etapas de duracción T1=100 ns., T2=125 ns., T3=125 ns., y
T4=100 ns. respectivamente, separadas por un registro de acoplo que introduce un
retardo de 25 ns. ¿Cuál es la máxima ganancia de velocidad posible? ¿Cuál es la
productividad máxima del cauce? ¿A partir de qué número de operaciones ejecutadas se
consigue una productividad igual al 90% de la productividad máxima?
Solución.
El cauce que se obtiene tendrá un tiempo de ciclo igual a
T = max {T1, T2, T3, T4} + retardo = max {100, 125 } + 25 = 150 ns.
donde
(1) lw r1,0x1ac
(2) lw r2,0x1fc
(3) add r3,r0,r0
(4) mult r4,r2,r1
(5) add r3,r3,r4
(6) add r5,r0,0x1ac
(7) add r6,r0,0x1fc
(8) sub r5,r5,#4
(9) sub r6,r6,#4
(10) sw (r5),r3
(11) sw (r6),r4
Solución.
El diagrama de ciclos correspondiente al código es el siguiente:
10
11
IF ID EX MEM OS
Se observa en el diagrama que se pierden 4 ciclos en los que no termina ninguna
instrucción debido a la dependencia de tipo RAW que existe entre las instrucciones (4) y
(5) respecto al registro r4, debido a que el resultado de la multiplicación (4) es el
operando de la instrucción (5), y la multiplicación tarda cinco ciclos en completarse. Por
ello, aunque haya varias unidades funcionales, que podrían aprovecharse en paralelo en
este caso (hay un multiplicador y un sumador en el cauce), la suma debe esperar a que
termine la multiplicación.
Teniendo en cuenta que en este cauce las instrucciones terminan de forma ordenada, las
dependencias de datos que pueden afectar son las de tipo RAW: las WAW y WAR no
dan problemas porque al escribirse los resultados en el banco de registros sólo en la
última etapa, se puede estar seguro que en el momento en que escribe una instrucción,
todas las instrucciones anteriores han realizado sus escrituras, y por supuesto, sus
lecturas.
Para contabilizar las dependencias de tipo RAW se toman aquellas instrucciones que
estén separadas por menos (estrictamente) de dos instrucciones, ya que son las que
podrían estar simultáneamente en el cauce, y en donde la instrucción que entra en
primer lugar en el cauce puede escribir sus resultados después de que las que le siguen
vayan a leerlos (no se respetaría que la lectura ha de ser posterior a la escritura). Aquí se
está considerando que la escritura en el banco de registros en la etapa OS se realiza al
comienzo del ciclo, y que la lectura en dicho banco se hace al final del ciclo, ya que si
no fuera así, las instrucciones separadas por otras dos instrucciones sí que podrían
ocasionar pérdidas de ciclo en los riesgos RAW. Teniendo esto en cuenta, las
dependencias de tipo RAW que existen son:
- El RAW (2)-(4) ocasiona 1 ciclo perdido. Este ciclo perdido retrasa la captación
de (5) respecto a (3) y el RAW (3)-(5) no ocasiona pérdidas de ciclos.
- El RAW (4)-(5) ocasiona una pérdida de 2 ciclos.
- Igual pasa con el RAW (8)-(10), éste ocasiona la pérdida de 1 ciclo, pero al
retrasar la captación de (11), hace que desaparezca el efecto del RAW (9)-(11).
3 (Ejercicios de clase)
Considerando el fragmento de código del problema anterior. ¿Cómo se podrían
reorganizar las instrucciones para que los riesgos de tipo RAW no tuvieran ningún
efecto cuando se utiliza un multiplicador con una latencia de cinco ciclos. (NOTA:
considere que intervienen los caminos de bypass)
Solución.
Pueden existir distintas formas de reorganizar el código para que los riesgos de tipo
RAW no tengan efecto. El objetivo es separar las instrucciones entre las que existían
riesgos de tipo RAW que producían pérdidas de ciclos utilizando otras instrucciones,
evitando que se introduzcan nuevos riesgos problemáticos, y lógicamente, sin cambiar
el resultado del programa.
En el caso que nos ocupa, se perdían 4 ciclos por el riesgo de tipo RAW existente entre
las instrucciones (4) de multiplicación (que duraba 5 ciclos) y la (5) de suma. Para
resolver el problema, una posibilidad es retrasar la instrucción (5), introduciendo entre
ella y la instrución (4) las instrucciones (6), (7), (8), y (9) ya que no dependen de la (5).
De esta forma, la instrucción (10) pasaría a estar a continuación de la (5) habría un
riesgo de tipo RAW (por r3). Si se utilizan caminos de bypass no se perderían ciclos,
pero, en cualquier caso, es posible reordenar (10) y (11) para que haya más seàración
entre (5) y (10). De esta forma, el código quedaría:
(1) lw r1,0x1ac
(2) lw r2,0x1fc
(3) add r3,r0,r0
(4) mult r4,r2,r1
(6) add r5,r0,0x1ac
(7) add r6,r0,0x1fc
(8) sub r5,r5,#4
(9) sub r6,r6,#4
(5) add r3,r3,r4
(11) sw (r6),r4
(10) sw (r5),r3
Al ejecutarlo, se puede observar que se necesitan 16 ciclos. Es decir, uno menos que el
valor mínimo, dado que aparece un riesgo estructural. En concreto, al mismo tiempo
que se termina la multiplicación, hay otra instrucción que se había metido en la unidad
de ejecución de enteros que también termina y, puesto que sólo una de las dos puede
pasar a la siguiente fase, habrá que detener una instrucción durante un ciclo. Esta
situación se puede comprobar en el siguiente diagrama:
7
Colisión:
terminan a la vez
8
11
10
(1) lw r1,0x1ac
(2) lw r2,0x1fc
(6) add r5,r0,0x1ac
(4) mult r4,r2,r1
(7) add r6,r0,0x1fc
(3) add r3,r0,r0
(8) sub r5,r5,#4
(9) sub r6,r6,#4
(5) add r3,r3,r4
(11) sw (r6),r4
(10) sw (r5),r3
4 (Ejercicios de clase)
Realice un programa para calcular la expresión aX+Y, donde a es un escalar y X e Y son
dos vectores cuyos componentes se encuentran almacenados en memoria en posiciones
consecutivas a partir de dos direcciones establecidas. Además, tanto a como las
componentes de X e Y son números de doble precisión.
Suponiendo un cauce con las etapas IF, ID, EX, MEM, WB, y que la multiplicación
tarda 5 ciclos y la suma 2, y hay un multiplicador y un sumador que pueden trabajar en
paralelo, estime el número de ciclos que se necesitarían, y aplique alguna técnica que
permita reducir los atascos (stalls) para este programa.
Solución.
Un programa posible para realizar aX+Y es el que se muestra a continuación
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
IF 1 2 3 4 5 6 7 7 8 9 9 9 9 10 10 11 12 13 13 5 6 7 7
ID 1 2 3 4 5 6 6 7 8 8 8 8 9 9 10 11 12 13 5 6 6
EX 1 2 3 4 5 6 6 6 6 6 8 8 9 10 11 12 13 5
7
ME 1 2 3 4 5 7 6 8 9 10 11 12 13 5
WB 1 2 3 4 5 7 6 8 9 10 11 12 13
Existen riesgos de tipo RAW que ocasionan pérdidas de ciclos, a pesar de que se
considere que se dispone de caminos de bypass:
- RAW entre la instrucción (5) y la (6): se pierde un ciclo debido a que la
multiplicación indicada en (6) no se puede empezar hasta que no se haya
captado de memoria el dato necesario, tras la etapa MEM de (5).
- RAW entre la instrucción (6) y (8), ya que no puede empezar la suma de (8)
hasta que no se haya terminado la multiplicación de (6)
- RAW entre (8) y (9), ya que hasta que no haya terminado la suma de (8) no
podría empezar la ejecución de (9).
- RAW entre las instrucciones (12) y (13), ya que se supone que, como en el caso
del procesador DLX, en la fase de decodificación de la instrucción de salto (13)
se debe haber ejecutado la instrucción anterior (12).
En la figura, los cuadros rallados corresponden a las etapas por las que iría pasando la
instrucción que se capta después de la de salto. Una posible forma de evitar los efectos
de una instrucción incorrectamente captada es, como en el caso del procesador que se
implementa en WinDLX, abortar la ejecución de toda instrucción captada tras una
instrucción de salto.
Por otra parte, obsérvese en la figura, que la instrucción (7) puede terminar antes que la
(6) dado que no existen dependencias entre ellas, y no afecta al resultado.
T(N) = 7 + 16*N
Así pues, cada iteración necesita 28 ciclos (en lugar de los 16 del bucle sin desenrollar),
pero hay que ejecutar la mitad de iteraciones (N/2). Por lo tanto, si a eso se unen los
cuatro ciclos de las instrucciones iniciales, y los tres que hay que esperar para que
termine la ejecución de la última instrucción, el tiempo necesario (suponiendo N par) es:
De esta forma, el número de ciclos que se reduce es igual al doble del número de
iteraciones del bucle inicial. Mediante una simulación del código anterior con WinDLX
se puede comprobar que el número de ciclos obtenido es 903 (N=64 en el programa).
Los cambios realizados con respecto al primer bucle desenrollado buscan distanciar en
el código aquellas instrucciones entre las que existían riesgos ocasionaban pérdidas de
ciclos. Así, para evitar el riesgo RAW entre las instrucciones (5) y (6), se ha introducido
entre ellas la instrucción (7). Entre las instrucciones (6) y (8) se han introducido dos
instrucciones sin dependencias entre ellas ni con (6) u (8) por lo que se reduce en uno, el
número de ciclos que se pierden en la situación anterior, ya que entre (6) y (8) hay dos
instrucciones en lugar de una. Igualmente, entre (6’) y (8’) se han introducido tres
instrucciones, y se reducen en dos, el número de ciclos que se perdían por las
dependencias entre la multiplicación y la suma. Sin embargo, al quedar las instrucciones
(9’) y (11’), una al lado de otra, se produce una pérdida de un ciclo por la dependencia
en r12.
Así pues, en cada iteración se pierden cuatro ciclos debido a dependencias, con respecto
al caso ideal en el que cada instrucción tarda un ciclo. Así pues, como en la iteración
hay 14 instrucciones y se pierden 4 ciclos, el tiempo de cada iteración es 14+4=18, más
un ciclo que se pierde siempre después de la instrucción de salto. En total tenemos que
cada iteración necesita 19 ciclos, y por tanto (teniendo en cuenta que N es par):
De esta forma, se ganan 4.5 ciclos por iteración con respecto al desenrollado anterior, y
6.5 ciclos por iteración con respecto a la situación inicial.
Estos datos se pueden comprobar mediante una simulación con WinDLX de los
programas propuestos.
5 (Ejercicios de clase)
Utilice la técnica de segmentación software (software pipelining) para mejorar las
prestaciones del programa que realiza el cálculo de aX+Y (sin utilizar desenrollado de
bucle). Siga considerando que el tiempo de la multiplicación es de 5 ciclos, y el de la
suma de 2 ciclos.
Solución.
El siguiente código muestra una forma posible de aplicar segmentación software al
programa que se utiliza de partida en el problema 4.
start: ld f0,a (1)
add r8,r0,rx (2)
addi r4,r8,#512 (3)
add r12,r0,ry (4)
loop0: ld f2,0(r8) (5)
multd f2,f0,f2 (6)
ld f4,0(r12) (7)
ld f6,8(r8) (8)
ld f8,8(r12) (9)
addd f4,f2,f4 (10)
loop: sd 0(r12),f4 (11)
multd f6,f0,f6 (12)
addi r8,r8,#8 (13)
addi r12,r12,#8 (14)
addd f4,f6,f8 (15)
ld f6,8(r8) (16)
ld f8,8(r12) (17)
sub r20,r4,r8 (18)
bnez r20,loop (19)
nop (20)
trap #0 (21)
En el programa, las instrucciones (1) – (4) coinciden con las del programa inicial, y
permiten que r8 apunte al comienzo del vector X, r12 al comienzo del vector Y, r4
apunta al primer byte después del vector X, y f0 se carga con el dato a.
En este grupo de instrucciones (5)-(10) que van desde la posición loop0 hasta la loop se
hacen los loads de la primera iteración, los cálculos de la primera iteración y los loads
de la segunda iteración.
- En la primera iteración, las instrucciones (12) y (15) realizan los cálculos con los
datos correspondientes a la segunda componente, a los que se ha accedido
mediante las instrucciones (8) y (9). Por lo tanto, en la iteración i del bucle, se
realizan las operaciones con las componentes i+1.
- En la primera iteración, las instrucciones (16) y (17) captan los datos
correspondientes a las terceras componentes de los vectores X e Y. Es decir, que
en la iteración i, se cargan las componentes i+2. Para ello, en (16) y (17) se
accede a la posición r8+8 y a la r12+8 respectivamente, puesto que en las
instrucciones (13) y (14) ya se había incrementado r8 y r12 en 8.
El tiempo de ejecución del programa en este caso se puede estimar si se tienen en cuenta
las instrucciones entre las que hay dependencias de tipo RAW y su separación. Así:
- Entre la instrucción (5) y (6) hay un RAW que dará lugar a un ciclo perdido por
que cuando empieza la multiplicación todavía no se ha terminado el acceso a
memoria: 1 ciclo perdido
- Entre la (6) y la (10) también hay un RAW, y puesto que la multiplicación que se
realiza en la (6) tarda (5) ciclos, se perderá un ciclo, ya que se introducen 3
instrucciones entre la (6) y la (10): 1 ciclo perdido
- Entre la (1) y la (11) hay un RAW, y puesto que la suma tarda dos ciclos, se
perderá un ciclo (suponiendo que hay adelantamiento, o caminos de bypass para
llevar el resultado de la suma directamente al registro para el almacenamiento en
memoria): 1 ciclo perdido
- Entre la (12) y la (15) hay un RAW, igual que entre la (5) y la (6). No obstante,
como ahora sólo se introducen dos instrucciones entre ellas, se perderán dos
ciclos: 2 ciclos perdidos
- Al terminar (15) se pierde un ciclo, debido ya que la suma tarda dos ciclos y
habrá un riesgo estructural con alguna de las instrucciones que la siguen para
acceder a la etapa MEM: 1 ciclo perdido.
- Entre la (18) y la (19) se pierde otro ciclo debido al riesgo RAW que existe entre
estas instrucciones, y a que se necesita haber ejecutado (terminado la etapa EX)
la instrucción (18) antes de que (19) esté en su etapa de decodificación (ID): 1
ciclo perdido.
Teniendo en cuenta el efecto de los riesgos en los ciclos perdidos tenemos que el tiempo
del programa anterior se puede calcular como sigue:
(1) Tiempo de la instrucciones (1) – (10) y primera iteración del bucle (11)-(19):
Sumando (1), (2), y (3) se tiene un total del 912 ciclos, que supone una reducción de
1031 – 912 = 119 ciclos (11.5% de reducción) con respecto a la situación inicial del
problema 4.
que supone casi un 25% menos de tiempo que en la situación inicial del problema 4.
Para N, se tendrá T(N) = 13 + 12* N, con lo que se consigue una reducción de 4*N
(para N elevados) con respecto a la situación inicial del problema 4.
6 (Ejercicios de clase)
En el problema 4 se ha supuesto que el procesador abortaba cualquier instrucción que se
captase después de una instrucción de salto. Esta situación obliga a que se tenga que
introducir una instrucción sin utilidad para el programa (instrucciones de no-operar).
Indique qué cambio haría en el código inicial si el procesador captara y ejecutara
normalmente la instrucción que sigue a una instrucción de salto condicional.
Solución.
Una forma posible de aprovechar que las instrucciones que siguen a una instrucción de
salto se ejecutan normalmente es poner la primera instrucción de una iteración (la
instrucción (5)) después de la instrucción de salto. Por supuesto, en el caso de que no se
produzca el salto también se ejecutará, y habrá que estudiar si esto tiene efectos en la
semántica del programa.
Otra posible mejora consiste en poner una instrucción de la iteración que siempre tiene
que ejecutarse, pero no afecta a la condición del salto. En el programa anterior se podría
situar detrás de la instrucción de salto, una de las instrucciones que actualizan los
registros que sirven de puntero para ir accediendo a los componentes del vector:
instrucción (11). En ese caso, el código sería:
En cualquier caso, hay que asegurarse que, al cambiar de sitio una instrucción, no se
empeora el efecto de posibles dependencias que no afectaban porque la instrucción
retardaba la captación de una instrucción con respecto a otras. En el código anterior, la
instrucción (11) retardaba la ejecución de (12) respecto de (10). No obstante, si se
considera que hay caminos de bypass, esta dependencia de tipos RAW entre (10) y (12)
no tiene efecto.
Notas:
Considere que los elementos de las matrices A, B, C y D están situados en
posiciones consecutivas a partir de las direcciones almacenadas en R1, R2, R3 y R4
respectivamente y que el valor de N está almacenado en R5.
Los elementos de las matrices son números reales de 32 bits.
Solución.
Para el caso en que el procesador no anule nunca la instrucción situada a continuación
del salto, el código del programa sería el siguiente:
Como el código utiliza la ALU para hacer todas las operaciones aritméticas, la latencia
de todas las operaciones es de un ciclo, con lo que suponiendo que existen caminos de
bypass, no existirían atascos en el cauce. Para aprovechar el salto retardado se ha
retrasado la instrucción que incrementa r4, que se ejecutará tanto si se salta como si no.
Para el caso de que el procesador anule la instrucción a continuación del salto si no se
salta (se supone que siempre se va a saltar), el código anterior funcionaría sin
problemas, ya que sólo se anularía el incremento de r4 en la última iteración, cuando
ya no hace falta volver a usarlo. Por último, si el procesador anulara siempre la
instrucción que está situada a continuación del salto, habría que subir el incremento de
r4 antes del salto y colocar tras el salto una instrucción nop, para que su anulación no
nos cause ningún problema.
(a) ¿Se ejecutaría el programa correctamente tal y como está? ¿Qué cambios haría
para aprovechar el salto retardado?
(b) ¿Cuál es la productividad del cauce en función del número de iteraciones N?
Solución.
El programa se ejecuta correctamente, ya que en cada iteración se ejecutará la
instrucción de almacenamiento que hay detrás del salto y el efecto que tendrá será
simplemente el de almacenar la suma parcial acumulada en f0. Sin embargo, esta
operación, aunque no provoca que el resultado sea incorrecto, sí que repercute en el
tiempo de ejecución del programa, ya que si el vector X tiene N elementos, se realizarán
N – 1 almacenamientos que consumen un tiempo de ejecución que podría usarse para
algo más provechoso. Por ejemplo, una posible optimización podría ser la siguiente:
sd R, f0 ; Guardamos el resultado
En este caso, la instrucción de después del salto retardado se utiliza para incrementar el
puntero al siguiente elemento de X, instrucción que hay que realizar de todas formas,
con lo que el cuerpo del bucle pasa a tener una instrucción menos que antes. Además, la
instrucción de resta se ha colocado detrás la instrucción de carga para ocultar su retardo
carga-uso.
Para obtener la productividad del cauce primero tenemos que calcular cuánto tiempo
tarda en ejecutarse el programa para un vector de N elementos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
TN 2 9 N 6 9 N 8
Sabiendo el tiempo de ejecución, la productividad del cauce se puede expresar en
términos de resultados por ciclo o de instrucciones por ciclo:
Nº instrucciones 6 N 3 Nº resultados N
WN instr./cic loWN resultados/ciclo
Tiempo 9N 8 Tiempo 9N 8
c[0] = a[N+1];
¿Qué cambios haría en el código en el caso en que hay problemas y para que, si es
posible, se mejoren las prestaciones?
Solución.
Dependiendo de la implementación del salto retardado, puede que sea necesario cambiar
el código del programa para asegurar su correcto funcionamiento:
(1) En el caso en el que la instrucción que entra en el cauce tras el salto se anule
siempre, sería necesario insertar una instrucción NOP entre el salto y la suma, ya
que en la última iteración, en la que no se debe saltar, se anularía la siguiente
instrucción al salto y la operación de almacenamiento final no accedería a la
dirección correcta.
(4) Por último, si la siguiente instrucción al salto se anula sólo si no se salta, ocurre
igual que en el caso (2), el programa podría fallar si dicha instrucción afecta a
los registros que se usan en el bucle. Pero en este ejemplo concreto el programa
funcionaría correctamente si el bucle itera más de una vez, ya que se fijaría en r5
el valor del puntero donde empieza la matriz c en todas las iteraciones menos en
la última, por lo que en el almacenamiento se accedería a la dirección correcta.
En este caso, también sería conveniente modificar el programa para ejecutar la
instrucción siguiente al salta una sola vez tras la última iteración y aprovechar el
spot del salto para realizar algún cálculo útil.
Cualquiera de las soluciones (2) y (4) son intercambiables para ambos casos.
Optimización
10 (Ejercicios de clase)
Suponga que las etapas de una unidad funcional segmentada S1, S2, S3, S4, y S5 se
utilizan en el orden S1,S3,S5,S1,S3,S4,S1,S3,S2,S5,S4,S2. ¿Cuál es el tiempo (en
número de ciclos) de latencia de inicio del cauce? ¿Cuál es la tabla de reservas y el
vector de colisiones inicial?. Si se supone el cauce vacío inicialmente y se introduce una
operación, ¿es posible introducir otra pasados 5 ciclos? ¿Cuál es el número mínimo de
ciclos que hay que esperar? ¿Cuáles son las latencias prohibidas en ese caso una vez que
se ha introducido la segunda operación?
Solución.
El tiempo de latencia de inicio del cauce es el tiempo que el cauce tarda en terminar una
operación (el tiempo que tarda en pasar por las distintas etapas hasta que se completa la
operación). Es igual, por tanto, al tiempo que tarda en terminarse la primera operación,
desde el momento en que empezó a funcionar.
La tabla de reservas tendrá, por tanto 12 columnas y 5 filas (una por etapa física del
cauce).
0 1 2 3 4 5 6 7 8 9 10 11
S1
X X X
S2
X X
S3
X X X
S4
X X
S5
X X
La lista de latencias prohibidas se obtiene contando, línea por línea, las columnas que
hay entre cada cruz y cada una de las que le siguen en esa misma línea. Por ejemplo, si
se toma la línea correspondiente a S1, las latencias prohibidas que hay son 3 (debido a
la cruz en 3 con respecto a la cruz en 0, y debido a la cruz en 6 con respecto a la cruz en
3) y 6 (debido a la cruz en 6 con repecto a la cruz en 0).
C = (1110100)
Eso quiere decir que, si tenemos el cauce vacío y se inicia una operación, las latencias
prohibidas para las operaciones que se intenten iniciar a continuación son 3, 5, 6, y 7, y
por tanto, cinco ciclos después de iniciar una operación (estando el cauce vacío) no
se puede iniciar otra operación.
El número mínimo de ciclos que hay que esperar una vez introducida una
operación (con el cauce vacío) es 1, ya que la componente 1 del vector de colisiones
inicial es 0 (es decir, 1 no es latencia prohibida).
(0111010) Vector de colisiones que había, desplazado una posición a la derecha (ha
pasado un ciclo)
Solución.
La ganancia en velocidad y la productividad del nuevo diseño se obtienen mediante las
siguientes ecuaciones:
Tno segmentado ( n)
S ( n) (1)
Tsegmentado ( n)
n
W (n) (2)
Tsegmentado ( n)
Así que para completar el cálculo de TLI necesitamos saber cuántos nanosegundos dura
cada ciclo de reloj. Teniendo en cuenta la duración de cada una de las etapas físicas y el
tiempo de los registros de acoplo, el tiempo de reloj se obtiene como:
Por lo que a partir de las ecuaciones (5) y (6) podemos concluir que el tiempo de
latencia inicial es de:
1 2 3 4 5 6 7 8
S1 X X
S2 X X
S3 X X
S4 X X
De esta tabla obtenemos que el conjunto de latencias prohibidas del cauce es:
F 1,3,5 (8)
C 10101 (9)
A partir de este vector se puede generar el diagrama de estados posibles del cauce,
obteniéndose:
10101 2, 4, 6+
Con lo que es fácil ver que la mínima latencia del cauce son 2 ciclos, así que:
De las ecuaciones (4), (7) y (10) podemos deducir que el tiempo segmentado es de:
Tsegmentado ( n) TLI MLM n 1 56 14 n 1 ns (11)
Así que ya podemos calcular las expresiones de ganancia y productividad del cauce
segmentado a partir de las ecuaciones (1), (2), (3) y (11):
25 n 25
S max lim S (n) lim 1.79 ns (14)
n 56 14 n 1 14
n
n 1
Wmax lim W ( n) lim 0.07143 ns 1 71.43 s 1
n n 56 14 n 1 14
(15)
Solución.
La ganancia en velocidad S(n) se define como el cociente entre los tiempos sin
segmentar y segmentado para ejecutar n operaciones:
Viendo el tiempo de ejecución de las diferentes etapas, fijaremos el tiempo de reloj del
cauce a:
TReloj max 3 ns, 4 ns, 5 ns 5 ns
Una vez obtenido el TLI, sólo nos queda obtener la Mínima Latencia Media (MLM) del
cauce propuesto en el enunciado. La tabla de reservas del cauce es la siguiente:
1 2 3 4 5 6 7 8
S X X X
1
S X
2
S X
3
S X X
4
S X
5
Mediante esta tabla de reservas, es fácil obtener las latencias prohibidas y los vectores
de colisiones:
F = {2,4,6} C = (101010)
Por último, para determinar la MLM, realizamos un diagrama de estados a partir del
vector de colisiones:
7+
7+
7+ 101010
1
3 1
7+ 5
5
101111 101011 111111
5
3
MLM = (5 + 3) / 2 = 4 ciclos = 4 · 5 ns = 20 ns
n n
WSeg ( n)
TSeg ( n) 20 ( n 1)
1 1 16 16
Wmax 50 MOPS S max 0.8
MLM 20 ns MLM 20
Solución.
El primer paso para resolver este problema es calcular la tabla de reservas para cada una
de las dos alternativas:
Alternativa 1 Alternativa 2
1 2 3 4 5 6 7 1 2 3 4 5 6
S X X S X
1 1
S X X S X X
2 2
S X X S X
3 3
S X S X X
4 4
Una vez calculadas las tablas de reservas es fácil obtener las latencias prohibidas y los
vectores de colisiones de cada una de las alternativas:
110 111
4+
Y después se busca el ciclo de menor latencia, que en este caso será el único ciclo del
diagrama. Por tanto, la latencia mínima es:
1 4
MLM 2,5
2
Tclock = máx{TS1, TS2, TS3, TS4} + Tacoplo = máx {4, 5, 2, 4} + 0,25 = 5 + 0,25 = 5,25 ns
Por tanto, la ganancia en velocidad de cada una de las alternativas respecto al caso
secuencial es de:
15 (Ejercicios de clase)
Se pretende utilizar un cauce con cuatro etapas, A, B, C, D, para aumentar el
rendimiento en la ejecución de una unidad funcional F. Las etapas se pueden utilizar
según una de las dos secuencias S1, y S2 siguientes:
S1 : ABACACABD S2 : ADBCCABD
Solución.
Para determinar cuál es la mejor opción se determinará la mínima latencia media
(MLM) que se puede conseguir en cada uno de los casos. La opción para la que la MLM
sea menor será la mejor. Para determinar la MLM en cada caso, habrá que construir la
tabla de reservas, generar el diagrama de estados posibles, e identificar los distintos
ciclos según los que se puede implementar la unidad de control del cauce, evaluando sus
latencias medias.
Opción S1)
A X X X X
B X X
C X X
D X
+7
A
101010
+7 +7
5 1
3 +7
D 5
101011 101111 111111
3 B
5 C
A partir del diagrama de estados, los ciclos posibles se muestran a continuación, junto
con las latencias y las latencias medias:
Ciclo Latencia Latencia Media
(A) 7 7
(AB) 7+1=8 8/2 = 4 (*)
(AC) 7 + 3 = 10 10/2 =5
(ACD) 3+5+7 = 15 15/3 = 5
(CD) 3+5=8 8/2 =4 (*)
(AD) 7 + 5 = 12 12/2 = 6
(ADC) 5+3+7 = 15 15/3 = 5
(D) 5 5
Los ciclos marcados con (*) son los que presentan la mínima latencia media: MLM=4
A X X
B X X
C X X
D X X
y el diagrama de estados
+7
111001 A
2,3 +7
111111
B
Por lo que los ciclos posible y las latencias medias correspondientes son:
(A) 7 7
La latencia de inicio (ciclos que tarda en pasar una operación por el cauce) es de 9
ciclos para S1, y de 8 ciclos para S2. El valor de MLM es de 4 para S1 y de 4.5 para S2,
por lo tanto:
S1)
W(n) = n / (9*50 + (n-1)*4* 50) = n / (450 + 200 (n-1)) -> Wmax = 1 / 200 (nsg-1)
S(n) = (350*n) / (450 + 200 (n-1)) --> Smax = 350 / 200 = 1.75
S2)
W(n) = n / (8*50 + (n-1)*4.5* 50) = n / (400 + 225 (n-1)) -> Wmax = 1 / 225 (nsg-1)
S(n) = (350*n) / (400 + 225 (n-1)) --> Smax = 350 / 200 = 1.56
Los valores de la eficacia se obtienen dividiendo los de la ganancia entre 4, puesto que
éste es el número de etapas del cauce.
Solución.
El primer paso para responder al primer apartado es calcular la tabla de reservas para
cada una de las dos alternativas:
Alternativa 1 Alternativa 2
1 2 3 4 5 6 7 1 2 3 4 5 6 7
S X X S X
1 1
S X S X X X
2 2
S X X S X X
3 3
S X X S X
4 4
Una vez calculadas las tablas de reservas es fácil obtener las latencias prohibidas y los
vectores de colisiones de cada una de las alternativas:
Alternativa 1 Alternativa 2
3
11 1 10110 4
3 6 6
11111 10111
4
1 6
MLM1 = 3 MLM 2 3,5
2
Para ver qué alternativa es capaz de ejecutar más operaciones por unidad de tiempo
basta con calcular la productividad máxima de cada una de ellas. La productividad
máxima se define como:
n n 1
Wmax lim W ( n ) lim lim
n n T ( n ) n TLI MLM ( n 1) MLM
1 1 1 1
W1 max 0,3 W2 max 0,29
MLM 1 3 MLM 2 3,5
con lo que podemos concluir que la primera alternativa es mejor que la segunda.
Para responder a la segunda cuestión, debemos calcular tanto el tiempo secuencial como
el de cada una de las alternativas para realizar 1000 operaciones. En el caso secuencial
tenemos que:
Tclock = máx{TS1, TS2, TS3, TS4} + Tacoplo = máx {4, 4, 3, 4} + 0,1 = 4 + 0,1 = 4,1 ns
Por tanto, la ganancia en velocidad de cada una de las alternativas respecto al caso
secuencial es de:
Solución.
El primer paso para responder al primer apartado es calcular la tabla de reservas para
cada una de las dos alternativas:
Alternativa 1 Alternativa 2
1 2 3 4 5 6 7 1 2 3 4 5 6 7
S X X S X
1 1
S X S X X
2 2
S X S X X
3 3
S X X X S X X
4 4
Una vez calculadas las tablas de reservas es fácil obtener las latencias prohibidas y los
vectores de colisiones de cada una de las alternativas:
Alternativa 1 Alternativa 2
3, 6+
4 10010 1
3
1111 3, 6+ 6+
5+ 10011 11011
4 3
1 3 3
MLM1 = 5 MLM 2 2,3
3
Para ver qué alternativa es capaz de ejecutar más operaciones por unidad de tiempo
basta con calcular la productividad máxima de cada una de ellas. La productividad
máxima se define como:
n n 1
Wmax lim W ( n ) lim lim
n n T ( n ) n TLI MLM ( n 1) MLM
1 1 1 1
W1 max 0,2 instr/ciclo W2 max 0,43 instr/ciclo
MLM 1 5 MLM 2 2,3
con lo que podemos concluir que la segunda alternativa es mejor que la primera.
Para responder a la segunda cuestión, debemos calcular tanto el tiempo secuencial como
el de cada una de las alternativas para realizar 1000 operaciones. En el caso secuencial
tenemos que:
Tclock = máx{TS1, TS2, TS3, TS4} + Tacoplo = máx {4, 4, 3, 4} + 0,1 = 4 + 0,1 = 4,1 ns
Por tanto, la ganancia en velocidad de cada una de las alternativas respecto al caso
secuencial es de:
Solución.
El primer paso para responder al primer apartado es calcular la tabla de reservas para
cada una de las dos alternativas:
Alternativa 1 Alternativa 2
1 2 3 4 5 6 7 1 2 3 4 5 6
S X X S X
1 1
S X S X X
2 2
S X X X S X X
3 3
S X S X
4 4
Una vez calculadas las tablas de reservas es fácil obtener las latencias prohibidas y los
vectores de colisiones de cada una de las alternativas:
Alternativa 1 Alternativa 2
3
3 1010 1 2 100 4
1
5
1
1011 1111 101 110 111
3 2
MLM1 = 3 MLM2 = 2
Para ver qué alternativa es capaz de ejecutar más operaciones por unidad de tiempo
basta con calcular la productividad máxima de cada una de ellas. La productividad
máxima se define como:
n n 1
Wmax lim W ( n ) lim lim
n n T (n) n TLI MLM ( n 1) MLM
1 1 1 1
W1 max 0,3 W 2 max 0,5
MLM 1 3 MLM 2 2
con lo que podemos concluir que la segunda alternativa es mejor que la primera.
Para responder a la segunda cuestión, debemos calcular tanto el tiempo secuencial como
el de cada una de las alternativas para realizar 500 operaciones. En el caso secuencial
tenemos que:
Tclock = máx{TS1, TS2, TS3, TS4} + Tacoplo = máx {4, 5, 2, 4} + 0,25 = 5 + 0,25 = 5,25 ns
Por tanto, la ganancia en velocidad de cada una de las alternativas respecto al caso
secuencial es de:
t0 t1 t2 t3 t4
S1 A B A B
S2 A B A
S3 B AB
Solución.
Los conjuntos de latencias prohibidas y los vectores de colisiones cruzadas para las
secuencias de instrucciones AA, BA, AB, y BB son los siguientes:
FAA = {3} Representan las latencias prohibidas que aparecen al introducir una
instrucción A, para las instrucciones de tipo A que se quieran introducir
después.
FBA = {1,2} Representan las latencias prohibidas que aparecen al introducir una
instrucción A, para las instrucciones de tipo B que se quieran introducir
después.
FAB = {1,2,4} Representan las latencias prohibidas que aparecen al introducir una
instrucción B, para las instrucciones de tipo A que se quieran introducir
después.
FBB = {2,3} Representan las latencias prohibidas que aparecen al introducir una
instrucción B, para las instrucciones de tipo B que se quieran introducir
después.
Puesto que el valor mayor de latencia prohibida incluida en los conjuntos anteriores es
4, los vectores de colisiones tendrán 4 componentes y serán:
CAB 1011
MB = =
CBB
0110
A5
A4 B5
B3, B4
0100 1011
0011 0110 B4
A3
A4
A2
A1 A4 A2 B4 B1
A1
A4 0111
0011 B3,B4
En el diagrama anterior, desde cualquier estado se pasa al estado inicial indicado por M A
(MB) cuando se introduce una instrucción A (B) en el cauce tras esperar 5 o más ciclos.
Ese es el significado de la flecha que llega a MA (MB) marcada con A5 (B5).
Solución.
El primer paso para calcular las matrices de colisiones cruzadas es obtener la tabla de
reservas:
1 2 3 4 5 6 7
S1 AB AB AB AB
S2 A B
S3 AB
S4 B A
Con esta tabla es fácil obtener las latencias prohibidas y los vectores de colisiones del
cauce:
101010 101010
M A M B
101010 101010
Para calcular la productividad máxima para una secuencia del tipo A, solo debemos
tener en cuenta el vector de colisiones CAA = (101010), que nos genera el siguiente
diagrama de estados:
1 5
101010
5
3 5
7
111111 101111 101011
1 7 5 3
MLM 4 cilos
2 2
Con lo que para una secuencia de n operaciones la productividad del cauce es de:
n n n 500 10 6
W ( n)
T (n) TLI MLM (n 1) 7 4(n 1)
n 500 10 6
W max lim W (n) lim 125 MOPS
n n 7 4( n 1)
21 (Ejercicios de clase)
Se tiene un cauce multifuncional con 4 etapas, S1,S2,S3,S4, que puede ejecutar dos
tipos de operaciones, A, y B. Las instrucciones del tipo A recorren el cauce según la
secuencia:
S1,S3,S2,S3,S1,S4
y las del tipo B según:
S1,S4,S1,S2,S3,S4
Solución.
Para determinar la mínima latencia media de la secuencia de instrucciones se parte de la
tabla de reservas:
S1 A B B A
S2 A B
S3 A A B
S4 B AB
FAA = {2,4}
FBA = {2,4}
FAB = {1,2,3}
FBB = {2,4}
Puesto que el valor mayor de latencia prohibida incluida en los conjuntos anteriores es
4, los vectores de colisiones tendrán 4 componentes y serán:
CAA 1010
MA = =
CBA
1010
CAB 0111
MB = =
CBB
1010
Debido a que la primera instrucción es del tipo A, se partirá del estado asociado a MA.
Desde ese estado se considerarán los posibles estados a los que se podría pasar cuando
llega una instrucción del tipo B (utilizando la matriz MB para generarlos), y así
sucesivamente. El diagrama generado es el siguiente:
A
(c) B5+
1010 0111
1010 1010
A4+
A4+
A4+
(b) B3
B1 (a)
0111 0111
1011 1111
El ciclo que presenta la mínima latencia media es el que se ha designa como (a), que
tiene una latencia total de 1+4 =5 ciclos, y una latencia media de 5/2=2.5, los otros
ciclos tienen latencias medias de 3.5, el (b), y 4.5 el (c). Teniendo esto en cuenta, la
productividad del máxima del cauce es:
t0 t1 t2 t3
S1 AC BC
S2 ABC A A
S3 B C
Solución.
A partir de la tabla de reservas del enunciado se pueden obtener las latencias prohibidas
del cauce y las matrices de colisiones para las tres operaciones:
1 1 1 0 1 0
MA 1 1 MB 0 0 MC 1 0
1 1 1 0 1 0
Siguiendo una planificación avariciosa del cauce, se pasarían por los siguientes estados:
A
11 A3 11
11 01
11 11
C3 B1
B3
10 10 C1 11
10 00 10
10 10 11
Por lo que el tiempo total de ejecución de la secuencia sería de 16 ciclos, como si indica
en el siguiente diagrama de tiempos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
A
B
C
B
A
C
t0 t1 t2 t3
S1 AC B
S2 ABC B A
S3 B AC
Solución.
Las listas de latencias prohibidas son:
10 11 00
MA = 11 MB= 01 MC= 10
10 11 00
C1 C2 A1 B3 B2
A 1 0 0 1 1 1
0 1 0 0 1 1
1 1 1 1 0 0
1 1 0 1 1 1
1 0 0 1 1 1
0 1 0 0 1 1
1 2 3 4 5 6 7 8 9 10 11 12
A
C
C
A
B
B
Solución.
El primer paso para resolver el problema es determinar la tabla de reserva del cauce:
1 2 3 4 5 6
S1 Y Y X X
S2 X Y Y X
S3 X Y
S4 X Y
A partir de esta tabla podemos determinar las matrices de colisiones del cauce:
1 0 0 0 1 0 1 1 1 1
M X M Y
0 1 1 1 1 0 0 0 1 0
Como en el enunciado nos piden que calculemos cuánto tiempo tarda en ejecutarse la
secuencia de operaciones X, Y, Y, X, X, Y, Y, Y, no tenemos que dibujar el diagrama de
estados completo, sino sólo la parte que se utiliza para determinar las latencias de esta
secuencia. A continuación se muestra dicha parte.
X (1)
El tiempo que tarda en ejecutarse esta secuencia es igual a 27 ciclos, como se puede
calcular con ayuda de la siguiente gráfica:
X
Y
Y
X
X
Y
Y
Y
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
Para calcular la productividad máxima para esta secuencia tenemos que tener en cuenta
que la siguiente iteración no puede comenzar hasta el ciclo 28, ya que tenemos que
esperar 5 ciclos después de la última Y para introducir la X de la siguiente secuencia,
como indica el diagrama de estados, así que podremos empezar una nueva secuencia
cada 27 ciclos, por tanto, el tiempo para calcular n secuencias será:
n n 1
W max lim lim ciclos 1
n T (n ) n 28 27( n 1) 27
Es decir, que podremos producir una secuencia cada 26 ciclos. Como la secuencia está
compuesta por 8 operaciones, la productividad máxima en operaciones por segundo
sería:
1 secuencia 8 instr/sec
W max 296,296 MOPS
27 ciclos 10 -9 s/ciclo
25 (Ejercicios de clase)
Un procesador segmentado tiene 5 etapas S1, S2, S3, S4, S5 y todas tardan un ciclo
excepto la etapa S3 (etapa de ejecución) que, según las instrucciones puede tardar 2 o 3
ciclos. ¿Cuál es la velocidad pico de ese procesador si funciona a 500 MHz? ¿Qué
mejora podría implementar para mejorar esa velocidad pico? ¿Qué valor alcanzaría
entonces?
Solución.
(a) Teniendo en cuenta que una etapa dura dos ciclos para un tipo de instrucciones y tres
ciclos para otro tipo, en el mejor de los casos (si todas olas instrucciones del programa
son de aquellas en las que la etapa S3 duran dos ciclos), se puede terminar una
instrucción cada dos ciclos.
1(instruccio
n)
V pico * 500* 106(ciclos .) 250* 106(instruccio
/ sg nes .) 250
/ sg MIPS
2(ciclos
)
Este apartado se podría resolver de forma más rigurosa a partir de las latencias
prohibidas del cauce (teniendo en cuenta que es un cauce multifuncional). Así, la tabla
de reservas para la situación descrita es la siguiente:
S1 AB
S2 AB
S3 AB AB B
S4 A B
S5 A B
Donde se puede comprobar fácilmente que cualquier ciclo que se construya tiene una
latencia media que estará entre 2 (como mínimo) y 3 (como máximo). Por lo tanto, la
velocidad pico corresponderá a la situación e que la MLM (mínima latencia media) es
igual a 2, tal y como se había estimado antes.
(b) Para mejorar la velocidad del procesador, una posible mejora consiste en añadir
varias etapas S3 que puedan funcionar simultáneamente, tal y como muestra la figura.
S3
S1 S2 S3 S4 S5
S3
Además de añadir estas dos etapas S3 adicionales, habría que mantener las instrucciones
de tipo A en la etapa S3 durante tres ciclos en lugar de dos ciclos.
Otra posibilidad consiste en rediseñar la etapa S3 de forma que conste de tres etapas
independientes de un ciclo cada una de ella. En este caso, también debe ocurrir que las
instrucciones de tipo A pasn por las tres etapas nuevas.
1(instruccio
n)
V pico * 500* 106(ciclos .) 500* 106(instruccio
/ sg nes .) 500MIPS
/ sg
1(ciclo
)
t0 t1 t2 t3 t4
S1 X X
S2 X
S3 X X
S4 X
Indique cuál es la productividad máxima de este cauce si se utiliza un reloj con una
frecuencia de 2 GHz. ¿A partir de qué número de sumas segmentadas consecutivas se
alcanza el 90% de la productividad máxima. ¿Qué cambios haría en la etapa S3 para
mejorar el rendimiento del cauce?
Solución.
La lista de latencias prohibidas es F={1,4} y por lo tanto C=(1001)
1001
3, 5+ 2
1011
La productividad es:
obteniéndose n=9.
t0 t1 t2 t3 t4
S1 X X
S2 X
S3 X
S3’ X
S4 X
Con lo que la única latencia prohibida sería F=4. Si se hace el diagrama de estados
partiendo de C=(1000) se observa que la mínima latencia media que se obtiene en este
caso es menor que 2.5.