Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada pordaymer cervantesa Modificado hace 7 años
2
PROCESADORES SUPERESCALARES: MICRORQUITECTURAS Y PRINCIPIOS DE FUNCIONAMIENTO Integrantes: Cano Salas David Cruz Trujillo Iván Quispe Navarro Jordan Huanca Urrutia John Condori Mamani Fredy
3
3.1. INTROCUCCION: DEFINICION Y NOTAS HISTORICAS En ese capitulo trataremos de procesadores segmentados cuyas etapas se han diseñado de forma que puedan procesar mas de una instrucción por ciclo, incorporando en su microarquitectura el hardware necesario para la gestión dinámica de los riesgos de datos y control.* Se realiza un diseño del cauce con un mayor número de etapas de menor duración. Así, al reducirse el tiempo de etapa, el cauce puede funcionar a frecuencias mayores.**
4
La diferencia entre un procesador superescalar y un procesador VLIW radica en si las técnicas que permiten el procesamiento simultaneo de instrucciones en cada etapa se implementan en hardware(procesadores superesclares) o descansan en la capacidad del compilador (procesadores VLIW)
5
El procesador dispone de dos unidades de procesamiento en coma flotante: una para la división y otra para la multiplicación.
6
Si en un procesador segmentado existen varias unidades funcionales que puedan utilizarse simultáneamente en distintas instrucciones y estas unidades funcionales tienen una duración diferente, pueden producirse situaciones como la imagen siguiente, donde hay instrucciones que terminan de procesarse antes que instrucciones que las preceden.
8
Una primera forma de mejorar el numero de instrucciones procesadas por ciclo consiste en organizar el procesador en varios cauces que funcionen en paralelo y de forma independiente. La figura siguiente muestra un ejemplo de esta microarquitectura para un procesador segmentado capaz de procesar dos instrucciones por ciclo (dispone de dos cauces prácticamente independientes).
10
Sin embargo, la forma usual de organizar la microarquitectura en los procesadores superescalares se acerca mas al esquema a continuación, donde cada una de las etapas es capaz de procesar varias instrucciones por ciclo. Entre etapa y etapa existen diferentes estructuras de almacenamiento que guardan la información obtenida para cada instrucción procesada por la etapa anterior, hasta que les toca el turno de ser procesadas en la etapa siguiente.
12
3.2. PARALELISMO ENTRE INSTRUCCIONES (ILP) Y PARALELISMO DE LA MAQUINA El mayor o menor grado de paralelismo entre las instrucciones de un programa, es decir, la mayor o menor facilidad para encontrar en un programa instrucciones que puedan procesarse simultáneamente, depende de la frecuencia con que aparecen dependencias de datos y control; y de los retardos de las operaciones codificadas en las instrucciones, que determinan el momento en que el resultado de una operación esta disponible y pueden iniciarse las instrucciones que necesitan ese resultado como operando, o como condición de la que depende un salto condicional.
13
Los primeros prototipos fueron estudiados por IBM a través de dos proyectos: Cheetah(1982-83) y America (desde 1985). El proyecto Cheetah sirvio de base al proyecto America y a la linea RS/6000 o Power1(1990). El desarrollo de la linea de superescalares Alpha de DEC comenzo en 1988 a partir de un proyecto totalmente nuevo. El primer procesador superescalar comercial fue el procesador RISC de intel 960CA, introducido en 1989, tras el que muchos fabricantes incorporaron caracteristicas superescalares en sus lineas de procesadores comerciales.
14
Por ejemplo las instrucciones siguientes no presentan interdependencia: load r1, r2(23); r1 = m(r2+23) add r3, #1; r3 = r3 + 1 add r4, r5; r4= r4 + r5 En cambio las instrucciones siguientes deben ejecutarse secuencialmente, de forma que se respite el orden establecido por las secuencias RAW entre ellas. add r3, #1; r3 = r3 + 1 add r4, r3; r3 = r4 + r3 st (r4), r0;m( r4) = r0
15
En cualquier caso, el aprovechamiento del grado de paralelismo que posea una secuencia de instrucciones depende de los recursos de que disponga el procesador. Este paralelismo viene dado por el numero de instrucciones que pueden procesarse al mismo tiempo en cada una de las etapas del procesador: numero de instrucciones que pueden captarse, decodificarse, y escribir sus resultados al mismo tiempo. Desde hace bastante se viene realizando estudios experimentales para poner de relieve el grado de paralelismo entre instrucciones, para establecer los recursos que pueden aprovechar eficientemente en un procesador.
16
Así los estudios de Tjaden y Flynn en 1970 [Tjaden 70] y de Riseman y Foster en 1972 [Riseman 72] concluyeron que solo era posible aprovechar un paralelismo entre instrucciones bajo(en [Tjaden 70] se habla de un paralelismo igual a 1.8 como máximo). Esto supuso un freno en la investigación y desarrollo de procesadores que explotasen un paralelismo elevado entre instrucciones, hasta el trabajo de Nicolau y Fisher en 1984 [Nicolau 84]. En la tabla 3.2 se resumen los resultados de paralelismo para distintos programas que se han obtenido en estudios posteriores a [Nicolau 84]. Como se puede apreciar en la tercera columna de la tabla, el comportamiento de los programas puede variar considerablemente a medida que se tiene en cuenta ciertas limitaciones en recursos o en prestaciones de las técnicas implementadas para aprovechar el paralelismo entre instrucciones.
17
Tabla 3.2 Resumen de resultados de estudios de paralelismo posteriores a [NIC84] PROGRAMAMAQUINA IDEAL (IPC)LIMITACIONES (IPC) gcc54,82-35 espresso62,62-41 li17,92-16 fpppp75,23-59 doducd118,74-58 tomcat150,14-60
18
3.3 PROCESAMIENTO SUPERESCALAR DE INSTRUCCIONES Un procesador superescalar es un procesador segmentado que puede procesar mas de una instrucción en cada una de sus etapas. En primer lugar, LA ETAPA DE CAPTACIÓN DE INSTRUCCIONES (IF) es capaz de leer varias instrucciones por ciclo desde el nivel de cache mas elevado (cache L1). Las instrucciones pasan, en el orden que se han captado, a una cola desde donde se introducen ordenadamente en la ETAPA DE DECODIFICACIÓN, tantas como dicha etapa sea capaz de decodificar por ciclo. Al final de esta etapa se almacenan en una serie de estructuras(ventana de instrucciones, estaciones de reserva, buffer de renombramiento, buffer de reordenamiento, etc.) Existe una circuitería llamada genéricamente ETAPA DE EMISION, que se encarga de determinar que instrucciones pueden pasar a ejecutarse.
19
La ETAPA DE EJECUCION se implementa atreves de las distintas unidades funcionales que realizan las operaciones que codifican las instrucciones. Por ultimo se tendría la ETAPA DE ESCRITURA que almacenaría los resultados en el banco de registros del procesador
21
En un procesador superescalar las instrucciones se captan y se decodifican en el orden en que aparecen en el programa. Sin embargo, el orden en el que las instrucciones se ejecutan y el orden en que cambian los registros y la memoria pueden no coincidir con el orden de las instrucciones del código. Las razones para no respetar ese orden se encuentran en la posibilidad para aprovechar la forma mas eficaz posible el paralelismo entre instrucciones y el paralelismo disponible en el procesador.
22
Un procesador superescalar debe ser capaz de identificar el paralelismo entre instrucciones (ILP) que existe en el código y permitir que los recursos se usen lo mas eficazmente en la ejecución paralela de las instrucciones. La única restricción se refiere al mantenimiento de la semántica del programa, es decir, a asegurar que el resultado del programa sea correcto. Por tanto en un procesador superescalar, las instrucciones podrían empezar a ejecutarse ordenadamente o desordenadamente, según se respete o no el orden de captación y decodificación de las instrucciones. En la siguiente figura se compara el comportamiento de la emisión ordenada y desordenada para una secuencia de cuatro instrucciones para las que se indica entre paréntesis el numero de ciclos que tarda en ejecutarse la operación que codifican(2 ciclos la suma y resta y cinco ciclos el producto).
25
Por otro lado la realización de la emisión desordenada supone implementar aspectos propios del paradigma de flujo de datos, según el cual la disponibilidad de los datos es quien determina que instrucciones pueden pasar a ejecutarse y no el orden de las instrucciones del programa (maquinas de flujo de control). Así aunque el procesador funciona según el paradigma del flujo de control, en el caso de la emisión desordenada las instrucciones comienzan a ejecutarse en cuanto los datos de los que dependen están disponibles y el funcionamiento interno del procesador esta controlado, en cierto modo, por el flujo de datos que determina el orden en que se emiten las instrucciones.
28
En todos los casos anteriores se considera que el procesador es capaz de captar 4 instrucciones por ciclo y decodificar 2 instrucciones por ciclo y que puede emitir y finalizar tantas instrucciones por ciclo como sea posible. En el ejemplo mostrado anteriormente se puede ver que los casos donde la emisión es desordenada proporciona mejores tiempos que los casos en que es ordenada. Las flechas que se dibujan en las figuras indican algunas de las dependencias RAW entre las instrucciones.
29
A continuación tenemos los distintos problemas que se plantean en las distintas etapas de un procesador superescalar. 1. La decodificación paralela y el uso de la pre decodificación. 2. La emisión paralela de instrucciones a las unidades funcionales. 3. La ejecución paralela de las operaciones codificadas en las instrucciones en las distintas unidades funcionales. 4. La finalización del procesamiento de las instrucciones. 5. La detección y resolución de dependencias. 6. El mantenimiento de la consistencia secuencial mediante el desacoplo de la ejecución de la instrucción y la escritura de resultados.
30
3.3.1 DECODIFICADOR PARALELO Y PREDECODIFICACION La etapa de decodificación de un procesador súper-escalar debe ser capaz de decodificar varias instrucciones por ciclo. En un procesador súper-escalar no es posible comparar al mismo tiempo las dependencias entre los operandos de la instrucciones decodificadas y las instrucciones que ya se están ejecutando. Dada la cantidad de instrucciones que hay que decodificar por ciclo en un procesador super_escalar puede necesitarse varias etapas para la fase de codificación.
31
La etapa de pre-codificacion se suele encargar de determinar el tipo de instrucción y con ello facilitar el tipo de recurso que se va utilizar, por ejemplo. En el caso de instrucciones de salto, si se podría determinar de forma inmediata de que se trata de una instrucción de salto, su procesamiento podría iniciar antes de que pase por la etapa de decodificación, con el beneficio en lo que respecta a la penalización asociada al procesamiento de las bifurcaciones. Si en la precodificacion se obtiene información de la unidad funcionalque va a utilizarse en el procesamiento de la información se favorece una emisión mas rápida de la instrucción a los cauces enteros o de unidades de coma flotante. En un procesador súper-escalar no es posible comparar al mismo tiempo las dependencias entre los operandos de la instrucciones decodificadas y las instrucciones que ya se están ejecutando. Dada la cantidad de instrucciones que hay que decodificar por ciclo en un procesador super_escalar puede necesitarse varias etapas para la fase de codificación.
32
En la etapa de precodificacion se añade a la instrucción una serie de bits que permite la acelerar la decodificación completa de las instrucciones en la etapa posterior de decodificacion. Los bits que se añaden pueden estar entre los 4 o 7 en las arquitecturas RISC y algunos mas en la arquitectura CISC. En la figura se muestra la ubicación usual de la etapa de codificación y el efecto que tiene esta en cuanto a incremento del ancho de banda necesario hacia la cache L1 debido a los bits que se añaden Cache L2 128 bits por ciclo predecodificacion 148 bits por ciclo Cache L1
33
Dos ejemplos de uso de bits de precodificacion son los procesadores HP-PA7200, con arquitectura RISC y el AMD-K6 con arquitectura CISCx86 HP-PA7200 se añade bits por cada par de instrucciones para facilitar la comprobación de si las instrucciones se pueden ejecutar en paralelo en el cauce o hay algún tipo de dependencia (pueden superar en 10% a las SRAM de cache). AMD K6, la lógica de pre-codificacion indica la longitud de la instrucción x86 en bytes permitiendo la localización del final de cada instrucción, y se almacena en la cache L1 junto con las instrucciones, en una cache de 64 kbytes se incrementara 20kbytes para lo bits de precodificación.
34
En la tabla se muestra los bits de precodificacion utilizados en algunos procesadores Procesador (año)Numero de bits de precodificacion PA 7200 (1994)5 PA 8000 (1996)5 Power PC 620(1996)7 UltraSparc (1995)4 AMD K5 (1995)5 por (byte) R 10000 (1995)4
35
La evolución experimentada hacia la utilización de la pre-decodificación en distintas versiones de procesadores Sin predecodificacion Con predecodificacion Procesador (año)Instrucción emitida por ciclo Procesador (año)Instrucción emitida por ciclo PA 7100(1992)2PA 7100(1994) PA 7100(1996) 2424 PowerPC(1993) PowerPC(1994) 4343 PowerPC(1996)4 R8000(1994)4R10000 (1995)4 SuperSparc(1991)3UltraSparc(1995)4 AMD 29000(1995)4K5(1995)4
36
3.3.2 Emisión de instrucciones o ventana de emisión. Esta estructura se implementa a través de una cola de registros donde se almacenan las instrucciones que ha sido codificadas, y que están a la espera de ser emitidas a las unidades funcionales donde se ejecuta la operación que codifica. Para ser emitida una instrucción necesita que estén disponibles tanto sus operandos como la unidad funcional que le corresponde. Existen dos tipos de emisión según el alineamiento: Emisión alineada Emisión no alineada
37
Emisión alineada. Es alineada si no se pudiera agregar nuevas instrucciones en la ventana de instrucciones, hasta que esta no sea totalmente vaciada. Emisión no alineada. Mientras exista espacio en la ventana se puede ir introduciendo instrucciones para ser emitidas. En cuanto al orden. Emisión ordenada, se respeta el orden en que las instrucciones se han ido introduciendo en la ventana de instrucciones, este orden es el mismo en que las instrucciones se han ido decodificando, y coincide con el orden de las instrucciones en el programa. Emisión desordenada, no existe bloque, ya que puede emitirse todos todas las instrucciones que dispongan de sus operandos y de la correspondiente unidad funcional
38
En figura se muestra la emisión ordenada y emisión desordenada dcba a dcba c a ventana hgfedcba a En figura se muestra la emisión alineada y emisión no alineada hgfedcb c b hgfedd
39
La etapa de emisión tiene ciertas limitaciones en cuanto al numero máximo de instrucciones que puede emitir por ciclo, estas limitaciones están relacionadas con el numero de puertos de la estructura utilizada en la emisión. hgfedcba a hgfedcb c b hgfedf e d En figura se muestra la emisión alineada y emisión no alineada
40
En la tabla se indican las características de la emisión de instrucciones para algunos procesadores Emisión escalar (con bloqueo) Emisión superescalar directa alineada Emisión superescalar directa No alineada Emisión superescalar avanzada (sin bloqueo) I86(1978) I286(1982) I386(1985) I486(1988) PENTIUM (1993)PENTIUM II (1998) MC68000(1979) MC68020(1982) MC68030(1987) MC68040(1990) MC68060(1993) R2000(1987) R3000(1989) R4000(1993) R8000 (1994)R10000 (1996) PA7100 (1992)PA7200 (1995)PA8000 (1996) SPARC (1988) MICROSPARC (1991) SUPERSPARC (1992)ULTRASPARC (1995)SPARC (1995) POWER PC 604 (1993)POWERPC 603 (1993) POWERPC 604 (1994) POWERPC 620 (1995) ALPHA 21064 (1993) ALPHA 21164 (1995)
41
Comparando la ejecución de una secuencia de instrucción, emisión ordenada y desordenada 1Add r4, r1, r2 (2) 2Mult r5, r1, r5 (5) 3Sub r6, r5, r2 (2) 4Sub r5, r4, r3 (2)
42
4Sub r5 r4 0 add (r3) 1 3Sub r6 r5 0 mult (r2) 1 2Mult r5 (r1) 1 - (r5) 1 1Add r4 (r1) 1 - (r2) 1 Sub r5 r4 0 add (r3) 1 Sub r6 r5 0 mult (r2) 1 Se han emitido (1) y (2) Sub r5 r4 1 - (r3) 1 Sub r6 r5 0 mult (r2) 1 Sub r5 r4 1 - (r3) 1 Sub r6 r5 0 - (r2) 1 Ha terminado (2) pueden emitirse (3) y (4) Ventana de instrucciones Emisión ordenada
43
4Sub r5 r4 0 add (r3) 1 3Sub r6 r5 0 mult (r2) 1 2Mult r5 (r1) 1 - (r5) 1 1Add r4 (r1) 1 - (r2) 1 Sub r5 r4 0 add (r3) 1 Sub r6 r5 0 mult (r2) 1 Se han emitido (1) y (2) Sub r5 r4 1 - (r3) 1 Sub r6 r5 0 mult (r2) 1 Sub r5 r4 1 - (r3) 1 Sub r6 r5 0 - (r2) 1 Ha terminado (4) y ha terminado (2) pueden emitirse (3) Ventana de instrucciones Emisión desordenada
44
Estaciones de reserva: es frecuente que en muchas micro arquitecturas la ventana de instrucciones de divida en varias estructuras que reciben el nombre de estaciones de reserva o consignas (shelving), estas estructuras especifican para cada unida funcional no para un conjunto de unidades funcionales. La utilización de estaciones de reserva compartidas es una decisión que no afecta tanto a la complejidad de la micro-arquitectura como a la eficiencia en el aprovechamiento del paralelismo entre isntrucciones Si cada unidad funcional tiene su propia estación de reserva, no hace falta guardar información del tipo de operación a realizar en cada una de las líneas de las estaciones y se ahorran algunos bits en cada línea de la estación de reserva
45
Envió de instrucciones: Desde la estación de reservas, las instrucciones se envían a la unidad funcional cuando esta pueda empezar a ejecutar nuevas instrucciones. La política de envió implica, en primer lugar, la selección de las instrucciones ejecutables, son ejecutables todas aquellas instrucciones que tengan sus operandos disponibles. El envio puede ser ordenado, desordenado o parcialmente ordenado. Envio ordenado (power 1, powerPc y el AMD29000), las instrucciones no ejecutables bloquean a las instrucciones ejecutables, y el parcialmente ordenado (power 2, power PC 604, powerPC620) existe bloque solo en algunas instrucciones determinadas, en ele envio desordenado (Pentium Pro, el R10000 y el PA8000) no existe bloqueo.
46
Captación y comprobación de validez de operandos: cuando se utiliza estación de reserva existen dos políticas para captar los operandos en función del momento en que se lleva a cabo dicha captación, se puede acceder a los operandos en el momento en que se realiza las emisiones a las estaciones de reserva (mas rápido) o bien en el momento en que se envían las instrucciones a la unidad funcional correspondiente para su ejecución
47
3.3.3 RENOMBRAMIENTO DE REGISTROS
48
En un procesador escalar se pueden ejecutar varias instrucciones a la vez, su ejecución puede ser distinto al que tiene en el código (desordenadamente). Para que esto ocurra y los resultados sean correctos se necesitan recursos hardware, que gestionen las dependencias RAW, WAW, WAR
49
El renombramiento evita los problemas de los riesgos o dependencias WAW y WAR, usando registros de la microarquitectura, como elemento de almacenamiento, luego se leerá con dependencia RAW
50
Para hacer el renombramiento 1.- La escritura se hace en un registro diferente a los que usan los operandos y de los registros que se usan en otras escrituras 2.- Para mantener el RAW (registro que se lee debe ser igual al que registro que se escribe) R1=R2 + R0 R1a=R2+R0 R3=R1+R0 R3=R1a +R0
51
El renombramiento puede ser: Estático: Se hace durante la compilación (por el compilador) Dinámico: Se hace durante la ejecución del programa utilizando registros y hardware extra Completa (todas las instrucciones) Parcial ( algún tipo de instrucción o datos) Evolución del uso del renombramiento dinámico
52
Ejemplos de distintas organizaciones de los buffers de renombramiento: dentro del banco de registros de la arquitectura, en un banco separado, incluidos en el ROB
53
Hay 2 alternativas para el acceso a los buffers de renombramiento Acceso Asociativo: Cada línea del buffer tiene 5 Campos: Asignación valida, Registro de destino, Contenido, contenido valido, bit de asignación valida, se dice asociativo porque se busca línea por línea y se ve el registro de destino, y si la asignación es valida Acceso Indexado: Para cada registro existe un índice que apunta a la línea del buffer que renombro ese registro, con un campo de asignación valida que indica si se hizo o no el renombramiento.
54
a) Buffer de renombramiento con acceso asociativo Asignació n valida Registro de destino ContenidoContenido valido Bit de asignación ultima 053511 141411 122210 123201 …………… 0123…0123… Es 1 si se ha renombrado algún registro y la información de los otros campos es valida Indica el registro que se ha renombrado Datos actualizad os del registro “0” si una instrucción(emitida o enviada) va a escribir aquí su resultado (no hay dato) “1” si se hizo la ultima asignación al registro, se tomara este valor para la siguiente instrucción Búsqueda asociativa de r4 14
55
Apunta al ultimo renombramiento para el registro, es por eso que no hay bit de asignación ultima b) Buffer de renombramiento con acceso indexado Asignación valida Índice en el buffer de renombramient o 02 04 13 02 11 00 ContenidoContenido Valido 331 141 261 320 0 1 2 3 4 5 registros Tabla de índices : una línea por registro de la arquitectura Buffers de renombramiento Búsqueda en la línea de la tabla de índices correspondiente al registro r4 14 012345012345 Indica si se ha hecho o no el renombramiento Apunta a la línea del buffer que renombra ese registro
56
Posible ubicación de un buffer de renombramiento en una microarquitectura superescalar con estaciones de reserva
57
Funcionamiento del renombramiento de registros, la emisión y el envió en una microarquitectura con buffer de renombramiento de acceso asociativo y estaciones de reserva Se utilizaran las instrucciones: Mult r2,r0,r1 demora 5 ciclos Add r3,r1,r2 demora 2 ciclos Sub r2,r0,r1 demora 3 ciclos La captación de operandos se produce en la emisión El envio de instrucciones desde las estaciones de reserva a las unidades funcionales es desordenado Cuando las instrucciones vayan finalizando, los contenidos de las líneas donde se renombraban los registros se actualizan en el banco de registros y se invalidan las líneas correspondientes del buffer (EV=0), para poder ser utilizadas por otras instrucciones
58
Funcionamiento del renombramiento de registros, la emisión y el envió de en una microarquitectura con buffer de renombramiento de acceso asociativo y estaciones de reserva Mult r2,r0,r1 Add r3,r1,r2 Sub r2,r0,r1 r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 10 20 30 40 Cola de instrucciones Banco de registros Buffer de renombramiento OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino Estaciones de reserva(3 líneas c/u) mult Add/sub Unidades funcionales Asignación valida, Registro de destino, Contenido,Contenido valido, Bit de asignación ultima Son los mismos bit :Asignación valida, Registro de destino, Contenido,Contenido valido, Bit de asignación ultima Campo de operando Bit de validez Campo de operan do Línea del buffer del registro de destino
59
Mult r2,r0,r1 Add r3,r1,r2 Sub r2,r0,r1 r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 110011 2111011 31201 40 Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino mult011013 OCOS1/iS1VS1OS2/IS2VS2Rdestino mult Add/sub Estaciones de reserva Unidades funcionales 1.- Esta r0 y r1 en el buffer ? No 2.- Se renombran r0, r1 y r2 3.- r0 y r1 y la operación van a la estación Emision mult
60
Add r3,r1,r2 Sub r2,r0,r1 r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 110011 2111011 31200 41301 51201 Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino Add1013 (apunta a l registro 3) 04 (apunta a la linea 4) Sub011015(apunta a la linea 5) mult Add/sub Estaciones de reserva UF Envio mult Emision add, sub Mult 0*10, dest(3) 1.- Estan r1,r2 en el buffer? 2.-ro,r1,r2, Add, Sub van a la Estación de reserva Se guarda el código de la linea 3 del buffer
61
r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 110011 2111011 31200 41301 51201 Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino add1013 apunta al registro 3 04 mult Add/sub UF Estaciones de reserva Envio Sub Mult 0*10, dest(3) Sub 0-10 dest(5) Se permite el envío desordenado de sub (por tener datos), add espera dato de mult mult continua ejecutándose (5 ciclos), se empieza a ejecutar sub
62
r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 110011 2111011 31200 41301 512-1011 Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino add1013 (apunta al registro 3) 04 mult Add/sub Estaciones de reserva Termina Sub Mult 0*10, dest(3) Sub 0-10 dest(5) Otras instrucciones ya pueden usar este valor valido Primero debe terminar mult, luego se envia add
63
r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 110011 2111011 312010 41301 512-1011 Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino add101014 mult Add/sub Estaciones de reserva Termina Mult Mult 0*10, dest(3) Termino de ejecutarse Mult y entrega su resultado, el cual lo usara Add
64
r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult. 0144011 110011 2111011 312010 413 11 512-1011 Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino mult Add/sub Estaciones de reserva Envío add Add 0+10, dest(4) Cuando tienen que retirarse se actualizan los registros marcados con el bit de ultimo, al banco de registros Se envia la suma Cuando las instrucciones vayan finalizando, los contenidos de las líneas donde se renombraban los registros se actualizan en el banco de registros y se invalidan las líneas correspondientes del buffer (EV=0), para poder ser utilizadas por otras instrucciones
65
3.3.4 MANTENIMIENTO DE LA CONSISTENCIA. BUFFER DE REORDENAMIENTO
66
TRATAMIENTO DE INSTRUCCIONES En el procesamiento de las instrucciones se puede distinguir entre procesamiento y ejecución de una instrucción. El procesamiento de la instrucción El procesamiento de la instrucción hace referencia al paso de dicha instrucción por todas y cada una de las etapas del cause, desde que se capta hasta que la instrucción se retira del cause. La ejecución de la instrucción La ejecución de la instrucción se refiere al paso de la instrucción por las etapas del cause en las que la unidad funcional correspondiente realiza la operación codificada de la instrucción
67
También en el procesamiento de una instrucción se puede diferenciar dos finales: Final de la ejecución de la operación Final de la ejecución de la operación. A partir del que se dispone de los resultados generados por las unidades funcionales, pero no se escribe en los registros. Final del procesamiento de la instrucción o momento en que se retira o completa la instrucción Final del procesamiento de la instrucción o momento en que se retira o completa la instrucción. Cuando se retira del cauce, es el momento en el que se escriben los registros.
68
Falta analizar la manera de la cual las instrucciones se retiran o finalizan, escribiendo los resultados de su procesamiento en los registros de la arquitectura faltando analizar la forma en que se actualizan los registros. Esta actualización usualmente se realiza en la última etapa del cauce, denominada Etapa de finalización o de retirada de instrucciones.
69
En esta sección analizaremos la finalización de las instrucciones en el marco del mantenimiento de la consistencia secuencial en los procesadores superescalares. Esta consistencia secuencial se refiere: CONSISTENCIA DEL PROCESADOR Al orden en el que las instrucciones se completan: CONSISTENCIA DEL PROCESADOR CONSISTENCIA DE MEMORIA Al orden en el que se accede a memoria para leer (LOAD) o para escribir (STORE): CONSISTENCIA DE MEMORIA
72
CONSISTENCIA DE MEMORIA Los accesos a memoria se realizan a través de instrucciones LOAD/STORELOAD Calculo de la dirección de acceso Acceso a memoria (lectura) Escritura del dato leído en un registroSTORE Lectura del dato del registro Calculo de la dirección de acceso Acceso a memoria (escritura)
73
La siguiente tabla ilustra, con un ejemplo la mejora que puede suponer un modelo de consistencia de memoria débil En el ejemplo, las direcciones de memoria a las que se acceden, son diferentes sin necesidad de conocer r2.
74
Puede ocurrir que no se sepa si es la misma dirección. Por ejemplo, en la secuencia de instrucciones: st r1, 0x1C(r2) ld r3, 0x2D(r7) no esta claro si ambas direcciones son la misma hasta que no se complete el calculo de estas direcciones. Si fuesen iguales estaríamos ante un riesgo RAW entre las dos instrucciones y la instrucción de carga no podría adelantar a la instrucción de almacenamiento. Ante el hecho de que haya ambigüedad en las direcciones de memoria y se permita un adelantamiento, se conoce como adelantamiento especulativo.
88
3.4 PROCESAMIENTO DE LAS INSTRUCCIONES DE SALTO Hasta el momento se han estudiado los problemas planteados por las dependencias de datos RAW, WAR, y WAW en el procesamiento superescalar de instrucciones, donde cada etapa del cauce puede trabajar con más de una instrucción por ciclo. Se ha incidido en que estructuras como las estaciones de reservas, el buffer de renombramiento y el buffer de reordenamiento permiten aprovechar el paralelismo entre instrucciones a través de la emisión y/o ejecución desordenada de instrucciones. Para el estudio del procesamiento de los saltos en el ámbito de los procesadores segmentados empezaremos recordando los aspectos que encierra dicho procesamiento:
89
a. Detección de la instrucción de salto: cuanto antes se detecte que una instrucción es de salto antes puede empezar a procesarse como tal. De esta forma se puede reducir la posible penalización que ocasionan estas instrucciones si se produjese el salto. Así, si se identifica que una instrucción es de salto condicional en el momento de la captación, en lugar de esperar a la etapa de decodificación Existen varias posibilidades para la detección temprana de las instrucciones de salto: Detección paralela. Hay una etapa específica para detectar instrucciones de salto que opera en paralelo con una etapa común de decodificación. Esta alternativa se utiliza en los procesadores Alpha.
90
Detección anticipada Además de utilizarse la decodificación paralela, se analizan las últimas líneas de la cola de instrucciones captadas antes de que pasen a la unidad de decodificación. El PowerPC 603 usa esta estrategia. Detección integrada en la captación. En el momento en que se captan las instrucciones se detecta si la instrucción es de salto o no (para eso se pueden utilizar los bits de predecodificación, como hemos indicado antes). Esta opción se utiliza, por ejemplo, en el PowerPC 640.
91
b. Gestión de saltos condicionales no resueltos: si en el momento en que la instrucción de salto evalúa la condición de salto, ésta no se ha terminado de evaluar todavía, se dice que el salto o la condición de salto no se ha resuelto, Para resolver este problema, los procesadores superescalares suelen utilizar el procesamiento especulativo del salto. La instrucción de salto condicional comprueba el valor de los bits de estado adecuados según sea la condición que determine el salto. Esta forma de realizar los saltos condicionales establece una dependencia entre las instrucciones que viene determinada por la ubicación de dichas instrucciones, en lugar de aparecer explícitamente a través de los operandos de cada instrucción.
92
3.4.1 Alternativas para la gestión de los saltos condicionales Una vez que se ha detectado una instrucción de salto y se ha determinado la dirección de destino, interesa conocer cuanto antes si se verifica la condición de salto para empezar a captar lo más pronto posible las instrucciones desde la dirección de destino del salto, si finalmente hay que realizar el salto, y evitar que se introduzcan en el cauce instrucciones que no deben procesarse. En los procesadores superescalares existen varias posibilidades para gestionar los saltos condicionales no resueltos para minimizar la penalización derivada del posible retardo en la evaluación de la condición de salto.
93
bloquear la instrucción de salto, que no puede progresar en el cauce hasta que no se haya terminado de evaluar la condición. Esta alternativa corresponde, realmente, a la situación más desfavorable desde el punto de vista de las prestaciones y, en ese sentido se puede tomar como punto de partida para posibles mejoras procesamiento especulativo a los saltos. El procedimiento se basa en estimar de alguna forma el camino que, con más probabilidad, va a seguir la ejecución cuando se haya evaluado la condición de salto. múltiples caminos. En este caso si cada vez que llega una instrucción de salto, el procesador empezaría a captar y procesar instrucciones de los dos caminos alternativos. Esta opción es la más costosa en cuanto a demanda de recursos en el procesador
94
3.4.1.1 ALTERNATIVAS PARA LA PREDICCIÓN DE SALTOS LA PREDICCIÓN DE SALTOS SE BASA EN LA IDEA DE QUE EL COMPORTAMIENTO DE UNA INSTRUCCIÓN DE SALTO CONDICIONAL PRESENTA UNA CIERTA REGULARIDAD, Y POR TANTO PUEDE PREDECIR CON UNA TAZA DE ACIERTOS SUFICIENTEMENTE ELEVADA.
95
Predicción fija : Se toma siempre la misma decisión: el salto siempre de realiza > o > Predicción verdadera: La decisión de si se toma o no el salto se toma mediante: Predicción estática: Según los atributos de la instrucción de salto (El código de operación el desplazamiento, la decisión del compilador) Predicción dinámica: Según el resultado de ejecuciones pasadas de la instrucción (historia de las instrucciones de salto) Prestaciones Clasificación de los procedimientos de predicción de saltos.
96
Esquemas de Predicción fija Son aquellas en las que el procesador toma siempre la misma decisión ante cualquier instrucción de salto condicional en la cual solo encontramos dos alternativas posibles. Salto siempre no tomado: Para toda instrucción de salto cuya condición no esta resuelta se considera que lo mas probable es que se produzca el salto. Salto siempre tomado: Se considera que toda instrucción de salto condicional de salto condicional no resuelta da lugar a un salto, por lo que se empieza a captar instrucciones a partir de la dirección de destino de salto
97
Esquemas de Predicción verdadera La decisión de salto depende de las características propias de la instrucción de salto condicional concreta que se este ejecutando, por eso se decide que son de predicción verdadera en contraposición a los anteriores. Predicción estática: El presupuesto básico de estos esquemas es que ciertos atributos de la instrucción de salto están relacionados con la probabilidad de que dicha instrucción ocasione o no un salto. Predicción dinámica: En este tipo de esquemas, en cada ejecución de un programa se pretende utilizar el comportamiento observado de salto/ no salto de cada instrucción de salto condicional para establecer la predicción a realizar cuando esa instrucción vuelva a encontrarse.
98
EJEMPLOS DE PREDICCIÓN ESTÁTICA: Predicción basada en el código de operación: Según el tipo de instrucción de salto condicional se considera mas probable que se produce el salto o que no. Predicción basada en el desplazamiento del salto: Si el desplazamiento es positivo se predice usualmente, que el salto no se produciría y si el desplazamiento es negativo se predice usualmente, que el salto se producirá. Predicción dirigida por el compilador: A través de una serie de bits que existen en las instrucciones de salto, el compilador puede fijar la predicción que se va a realizar para la instrucción.
99
EJEMPLOS DE PREDICCIÓN DINÁMICA: Predicción dinámica implícita: Si no se guarda ninguna información explicita que presente el comportamiento pasado de la instrucción. Predicción dinámica explicita: Para cada instrucción de salto condicional, existe un conjunto de bits que codifican la información relativa al comportamiento pasado de la instrucción en cuestión
100
En la siguiente figura se muestra tres ejemplos de sistema de predicción dinámica sencillos que utilizan respectivamente, uno, dos, y tres bits de historia que se producen según el resultado de la instrucción de salto y el tipo de predicción que se hace en función de dichos bits. La primera ves que se ejecutan una instrucción de salto condicional, como no se dispone de bits de historia, el procedimiento de predicción presupone un determinado valor para los bits de estado, o bien utiliza algún esquema de predicción estática.
101
Predicción de un bit de historia La designación del estado indica lo que se predice y las flechas indican las transiciones de estado según lo que se produce al ejecutarse la instrucción (T, salto tomado, o NT, SALTO NO TOMADO) Predicción con dos bits de historia Existen cuatro posibles estados, dos de ellos corresponden a una predicción de realizar el salto (S) y otros dos a no realizar el salto (NS) Predicción con tres bits de historia La predicción viene determinada por el bit mayoritario (si hay mayoría de unos se predice salto, por ejemplo). Los bits se desplazan a la derecha introduciendo un 0 o un 1 según el resultado de la instrucción de salto.
102
3.4.1.2. RAMIFICACIÓN MULTICAMINO Gestión de saltos condicionales no resueltos. El procesador no debe decidir entre la secuencia de instrucciones que debe ejecutar cada vez que capta una instrucción de salto condicional no resuelta. Ejecuta las dos secuencias de instrucciones concurrentemente. No interferencias.
103
RAMIFICACIÓN MULTICAMINO
104
3.4.2. INSTRUCCIONES DE EJECUCIÓN CONDICIONAL Eliminar (o reducir, en la medida de lo posible) las instrucciones de salto en los códigos Resolver problema reducción de prestaciones: “Eliminar (o reducir, en la medida de lo posible) las instrucciones de salto en los códigos.” Dos partes: Primera: Es la condición. (guardia) Segunda: La operación. (almacena)
105
INSTRUCCIONES DE EJECUCIÓN CONDICIONAL Formato de las instrucciones: cmovxx. ra.rq, rb.rq: lectura rc.wq: escritura beq ra, etiqueta //si ra=0 saltar a etiqueta or rb, rb, rc //si no, copiar rb en rc Se sustituye por: cmovne ra, rb, rc para evitar la instrucción de salto condicional.
106
INTERUPCIONES EN UN PROCESADOR SUPERESCALAR La problemática que plantean las interrupciones en un procesador segmentado, se describieron posibles formas de gestionarlas. En general, se puede decir que los procesadores segmentados: 1.Es más complicado asociar una excepción a su causa: puesto que se están procesando varias instrucciones, se pueden producir excepciones simultáneamente originadas por distintas instrucciones. 2. Puede transcurrir bastante tiempo desde que se produce una interrupción hasta que se reconozca. 3.El estado de la máquina puede ser modificado por las distintas instrucciones que se están procesando y es difícil precisar el estado que debe guardarse para que la maquina se recupere después de atender la interrupción.
107
Para abordar esta dificultad que plantea la finalización desordenada de instrucciones existen varias alternativas: Ignorar el problema y considerar solo la posibilidad de interrupciones imprecisas. Antes de emitir una interrupción esperar a que las instrucciones anteriores terminen sin interrupciones. Almacenar los resultados de las instrucciones y solo escribirlos en los ficheros de la arquitectura cuando hayan terminado las instrucciones previas. Mantener la información necesaria para tener en cuenta las instrucciones que se han ejecutado anticipadamente, en el caso de que haya ávido una interrupción y poder deshacer sus efectos.
108
PARA MANTENER LA CONSISTENCIA CON EL MODELO SECUENCIAL DE EJECUCION EN EL CASO DE INTERRUPCIONES, SE PUEDE CONSIDERAR DOS POSIBILIDADES: 1.Las instrucciones se retiran ordenadamente, cambiando el estado de la maquina según el orden en que aparecen en el programa, existiendo siempre un estado de maquina bien definido.. 2. Las instrucciones cambian el estado de la maquina según se ejecutan y se deben añadir elementos que permitan reconstruir un estado bien definido si hay interrupciones
109
Interrupciones precisas con buffer de reordenamiento (ROB). Esta estrategia para la interrupciones utiliza un buffer de reordenamiento al que añade un campo mas en cada una de sus líneas. Este campo indica si la instrucción en cuestión ha dado lugar a una excepción en alguna de las etapas por las que ha pasado. Esta estrategia aprovecha que, gracias al buffer de reordenamiento, las instrucciones finalizan ordenadamente, y que la modificación de los registros de la arquitectura se produce en el momento en que la instrucción se retira del ROB.
110
En el ciclo 10 abra terminado de ejecutárselas instrucciones 9(add) y 10 (xor), pero todavía no se han escrito sus resultado en el banco de registros(hasta que no se retiren del RBO no se hará las escritura. Se ha producido le excepción en la instrucción 8 (st): las instrucciones que la siguen se marcaran para no actualizar sus resultados. La interrupción se atiende cuando se retire la instrucción st(int=para st) Ciclo 10 ciclo11 En la figura se ilustra la utilización del ROB en el procesamiento de interrupciones
111
En el caso de que se produzca una interrupción externa, esta estrategia basada en el ROB puede utilizarse igualmente, lo único que ocurriría ahora es que se marcaria el campo int de una de las instrucciones incluidas en el ROB (la mas próxima a la cabecera, por ejemplo si se quiere que la interrupción se atienda rápidamente) y también se marcaria su campo de vaciado y el de todas las instrucciones que le siguen. Interrupciones precisas con buffer de historia. Este buffer permite que las instrucciones modifiquen el estado de la maquina a medida que termina la ejecución, produciéndose por tanto una finalización desordenada. Para ello el buffer de historia guarda información acerca del estado que se ha modificado al actualizar los registros de la arquitectura, de forma que esta se pueda recuperar en el caso de que se produzca alguna interrupción.
112
Valores de r2 r3 antes de que las instrucciones 9 y 10 escribieran sus resultados tras terminar su ejecución r2=17 resultado de las instrucciones 9 y 10 r3=0xa1 Cuando la instrucción que ha dado lugar a la excepción llegue a la cabecera del buffer, se atenderá la interrupción y para todas aquellas instrucciones que estén marcadas en 1 en el buffer de historia, se restauraran los valores de sus registros de destino(con los que tienen almacenados en el campo de valor anterior(Old. Vanl.) Las escrituras se realizan desde las mas recientes a las mas antiguas(como indica la flecha.
113
Interrupciones precisas con punto de chequeo-reparación. En esta estrategia, el estado de la maquina se almacena en determinadas etapas del cuace que reciben el nombre de punteros de chequeo. En caso de interrupción, la existencia de estos estados almacenados permite recuperar o reparar el estado de la maquina tras atender la interrupción. Sub/ add : 4 ciclos Mult: 7 ciclos Se pueden captar y decodificar dos interrupciones por ciclo y hay varias unidades de sub/ add Esta instrucción termina su ejecución antes de la instrucción demultiplicar que esta antes en código
114
En la figura se describe el proceso de atención a una interrupción que se produce mientras se esta ejecutándo la multiplicación, una vez que se ha escrito el resultado de la instrucción add en r4.
115
Interrupciones precisas con registros de futuro y ROB. En este caso se utiliza una estructura denominada banco de registros de futuro. Este banco de registros es el que las instrucciones modifican (desordenadamente) cuando terminan la ejecución de las operaciones que codifican, y desde donde las instrucciones que emiten leen los valores de sus operandos. El estado preciso que permite la recuperación correcta del programa interrumpido se mantiene en el banco de registros gracias al uso de un buffer de reordenamiento. Si se utiliza banco de registro de futuro, el buffer de reordenamiento no necesita disponer de un campo especifico para almacenar los resultados temporalmente ya que estos se almacenan en los bancos de registro de futuro. En realidad, se puede decir que el banco de registro de futuro mas el ROB corresponden a una forma de organizar la micro arquitectura en la que separa el espacio de almacenamiento temporal(que se ubica en el banco de registros, el banco de registro de futuro) y un buffer que controla la finalización ordenada de las instrucciones.
116
Datos Resultados Resultados Si hay interrupciones Unidades funcionales ROB Registros de la arquitectura Banco de registros De futuro
117
Registro de futuro II se suponen iguales Se actualiza el banco de registros al retirarse sub Cuando se va retirar mult se detecta la condición de interrupción y se actualizan los registros de futuro Excepción (la instrucción mult ocasiona un error) Banco de registros de la arquitectura Tras atender la excepcion se reiniciará a partir de la instrucción multr3, r1, r4
118
PROBLEMAS
121
Ciclo 3:Llegada de i1 a la estación de reserva Renombramiento de F3 como Fr1.
122
Ciclo 4: Llegada de i2 a la estación de reserva. Renombramiento de F2 como Fr2. Emisión a la U Funcional y comienzo de ejecución de i1.
123
Ciclo 5: Llegada de i3 e i4 a la estación de reserva. Renombramiento de F2 como Fr2 y F3 como Fr3. Segundo ciclo de ejecución de i1.
124
Ciclo 9: Finalización de i1. Escritura de resultado en Fr1 y copia a estaciones de reserva para emisión de i2 e i3.
125
Ciclo 10: Emisión de i2 e i3. Liberación de Fr1.
126
Ciclo 11: Finalización de i2 e i3.Escritura de resultado en Fr2 y Fr3 respectivamente. Copia del valor de Fr2 en entrada de la instrucción i4 para poder emitirla.
127
Ciclo 12: Emisión de i4. Escritura de resultado de Fr2 en F2. Liberación de Fr2. Escritura de resultado en Fr3 en F3. Liberación de Fr3.
128
Ciclo 13:Finalización de i4. Escritura de resultado en Fr4.
129
Ciclo 14: Escritura de Fr4 en F5. Liberación de Fr4.
132
2. Para el fragmento de código siguiente: lwr1, 0x1ac; r1=m[0x1ac] lwr2, 0xc1f; r2=m[0xc1f] addr3,r0,r0; r3=r0+r0 mulr4,r2,r1; r4=r2*r1 addr3,r3,r4; r3=r3+r4 addr5,r0,0x1ac; r5=r0+0x1ac addr6,r0,0xc1f; r6=r0+0xc1f subr5,r5,#4; r5=r5-4 subr6,r6,#4; r6=r6-4 sw(r5),r3; m[r5]=r3 sw(r6),r4; m[r6]=r4 y suponiendo que se pueden captar cuatro instrucciones por ciclo y emitir cuatro instrucciones por ciclo, indicar el orden en que se emitirán las instrucciones para cada uno de los siguientes casos:
133
a)Una ventana de instrucciones centralizada con emisión ordenada y alineada [4] mul r4,r2,r1 [3] add r3,r0,r0 [2] lw r2, 0xc1f [1] lw r1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 [4]mulr4,r2,r1 Emite [1] Termina [3] Termina [2] Emite [4] Después de 6 ciclos Termina [4] [4]mulr4,r2,r1 [3] add r3,r0,r0 [2] lw r2, 0xc1f [4]mulr4,r2,r1 [3] add r3,r0,r0 [2] lw r2, 0xc1f *Termina [1] Emite [2] y [3]
134
a)Una ventana de instrucciones centralizada con emisión ordenada y alineada (continuación) [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 [8] sub r5,r5,#4 [7]add r6,r0,0xc1f [6]add r5,r0,0x1ac [5]add r3,r3,r4 [8] sub r5,r5,#4 [11]sw (r6),r4 [10]sw (r5),r3 [9]subr6,r6,#4 Emite [5], [6] y [7] Termina [5], [6] y [7] Emite [8] Termina [8]
135
a)Una ventana de instrucciones centralizada con emisión ordenada y alineada (continuación) [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 [10]sw (r5),r3 [9]sub r6,r6,#4 Emite [9] y [10] [11] sw (r6),r4 Termina [9] y [10] Emite [11] Orden de la emisión: 1-2-3-4-5-6-7-8-9-10-11
136
b)Una ventana de instrucciones centralizada con emisión desordenada y alineada [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 [4] mul r4,r2,r1 [3] add r3,r0,r0 [2] lw r2, 0xc1f [1] lw r1, 0x1ac [4] mul r4,r2,r1 [2] lw r2, 0xc1f[4]mul r4,r2,r1 Emite [1] y [3] Emite [2] *Termina [2] Emite [4] [4] mul r4,r2,r1 [2] lw r2, 0xc1f [4] mul r4,r2,r1 [2] lw r2, 0xc1f Termina [3] Termina [1]
137
b)Una ventana de instrucciones centralizada con emisión desordenada y alineada (continuación) [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 [8] sub r5,r5,#4 [7]add r6,r0,0xc1f [6]add r5,r0,0x1ac [5]add r3,r3,r4 [8] sub r5,r5,#4 [5] add r3,r3,r4 [8] sub r5,r5,#4 [5]add r3,r3,r4 Emite [6] y [7] Termina [6] y [7] Emite [8] Termina [8] y [4]
138
b)Una ventana de instrucciones centralizada con emisión desordenada y alineada (continuación) [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 [5]add r3,r3,r4 Emite [5] [11]sw (r6),r4 [10]sw (r5),r3 [9]sub r6,r6,#4[11]sw (r6),r4 Emite [9] y [10] Emite [11] [11]sw (r6),r4 Termina [9] y [10] Orden de la emisión: 1-3-2-4-6-7 8-5-9-10-11
139
c)Una estación de reserva de tres líneas para cada unidad funcional, con envío ordenado y ventana deslizante [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 mulr4,r2,r1 addr3,r0,r0 lwr2,0xc1f lwr1,0x1ac ID/ISS LW ADD/ SUB MUL SW
140
c)Una estación de reserva de tres líneas para cada unidad funcional, con envío ordenado y ventana deslizante [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 subr5,r5,#4 addr6,r0,0xc1f addr5,r0,0x1ac addr3,r3,r4 lwr2,0xc1f lwr1,0x1ac addr3,r0,r0mulr4,r2,r1 ID/ISS LW ADD/ SUB MUL SW Se emite [1] y [3]
141
c)Una estación de reserva de tres líneas para cada unidad funcional, con envío ordenado y ventana deslizante [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 sw(r6),r4 sw(r5),r3 subr6,r6,#4 subr5,r5,#4 lwr2,0xc1f addr6,r0,0xc1f addr5,r0,0x1ac addr3,r3,r4 mulr4,r2,r1 ID/ISS LW ADD/ SUB MUL SW Termina [3] Se emite [5], [6] y [7]
142
c)Una estación de reserva de tres líneas para cada unidad funcional, con envío ordenado y ventana deslizante [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 lwr2,0xc1f subr6,r6,#4 subr5,r5,#4 mulr4,r2,r1 sw(r6),r4 sw(r5),r3 ID/ISS LW ADD/ SUB MUL SW Termina [1], [5], [6] y [7] Se emite [2], [8] y [9]
143
c)Una estación de reserva de tres líneas para cada unidad funcional, con envío ordenado y ventana deslizante [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 mulr4,r2,r1 sw(r6),r4 sw(r5),r3 ID/ISS LW ADD/ SUB MUL SW Termina [8] y [9] Se emite [10]
144
c)Una estación de reserva de tres líneas para cada unidad funcional, con envío ordenado y ventana deslizante [1] lwr1, 0x1ac [2] lwr2, 0xc1f [3] addr3,r0,r0 [4] mulr4,r2,r1 [5] addr3,r3,r4 [6] addr5,r0,0x1ac [7] addr6,r0,0xc1f [8] subr5,r5,#4 [9] subr6,r6,#4 [10] sw(r5),r3 [11] sw(r6),r4 mulr4,r2,r1 sw(r6),r4 ID/ISS LW ADD/ SUB MUL SW Termina [2] y [10] Se emite [4] y 1c después [11]
145
¿Cómo renombraría un compilador los registros en la secuencia de instrucciones siguiente para que no existan riesgos WAW ni WAR y utilizando el menor número de registros posible? addr3,r2,r1; r3 = r2 + r1 subr2,r3,r2; r2 = r3 - r2 addr4,r2,r3; r4 = r2 + r3 multr3,r5,r3; r3 = r5 * r3 subr2,r4,r6; r2 = r4 - r6 ¿Cómo se realizaría el renombramiento en un buffer de renombramiento con acceso asociativo si se captan, decodifican hasta tres instrucciones por ciclo? ¿Cuánto tardarían en ejecutarse todas las instrucciones si add y sub consumen 2 ciclos y mult 5 ciclos y se pueden emitir hasta 3 instrucciones por ciclo (con emisión desordenada y no alineada)
146
addr3,r2,r1 subr2,r3,r2 addr4,r2,r3 multr3,r5,r3 subr2,r4,r6 addr3,r2,r1 subr2,r3,r2 addr4,r2,r3 multr3,r5,r3 subr2,r4,r6 addr3,r2,r1 subr7,r3,r2 addr4,r7,r3 multr8,r5,r3 subr2,r4,r6 addr3,r2,r1 subr7,r3,r2 addr4,r7,r3 multr8,r5,r3 subr2,r4,r6 ¿Cómo renombraría un compilador los registros en la secuencia de instrucciones siguiente para que no existan riesgos WAW ni WAR y utilizando el menor número de registros posible? Se están usando los registros: r1,r2, … r6. Entonces podemos usar los registros: r7, r8, …
147
Asignación valida Registro de destino Contenido Contenido Valido Bit de asignación última 03X11 17Y11 04Z11 18U11 02V11 addr3,r2,r1 subr7,r3,r2 addr4,r7,r3 multr8,r5,r3 subr2,r4,r6 addr3,r2,r1 subr7,r3,r2 addr4,r7,r3 multr8,r5,r3 subr2,r4,r6 ¿Cómo se realizaría el renombramiento en un buffer de renombramiento con acceso asociativo si se captan, decodifican hasta tres instrucciones por ciclo?
148
¿Cuánto tardarían en ejecutarse todas las instrucciones si add y sub consumen 2 ciclos y mult 5 ciclos y se pueden emitir hasta 3 instrucciones por ciclo (con emisión desordenada y no alineada) 123456789101112 add r3,r2,r1 sub r7,r3,r2 add r4,r7,r3 mult r8,r5,r3 sub r2,r4,r6 IFCaptación de la instrucción IDDecodificación de la instrucción y captación de operandos ISSEtapa de emisión EXEjecución de la operación WBEscritura del resultado
149
Considérese que el fragmento de código siguiente : lw r3,0x10a addi r2,r0,#128 add r1,r0,0x0a lw r4,0(r1) lw r5,-8(r1) mult r6,r5,r3 add r5,r6,r3 add r6,r4,r3 sw 0(r1),r6 sw -8(r1),r5 sub r2,r2,#16
150
se ejecuta en un procesador superescalar que es capaz de captar 4 instrucciones/ciclo, de decodificar 2 instrucciones/ciclo, de emitir 2 instrucciones/ciclo, escribir hasta 2 resultados/ciclo en los registros correspondientes, y completar (o retirar) hasta 2 instrucciones/ciclo. Indicar el numero de ciclos que tardaría en ejecutarse el programa suponiendo: a) Emisión ordenada y ejecución desordenada. b) Emisión desordenada y ejecución desordenada. Nota: considérese que tiene una unidad funcional de carga (con latencia 2), una de almacenamiento (con latencia 1), tres unidades de suma/resta (latencia 1) y una de multiplicación (latencia 6); y que no hay limitaciones para el numero de lineas de la cola de instrucciones, ventana de instrucciones, buffer de reordenamiento, puertos de lectura/escritura, etc.)
151
123456789101112131415161718 lw r3,0x10a IFIDISSEX WB addi r2,r0,#128 IFIDISSEXWB add r1,r0,0x0a IFID ISSEXWB lw r4,0(r1) IFID ISSEX WB lw r5,-8(r1) IFID ISSEX WB mult r6,r5,r3 IFID ISSEX WB add r5,r6,r3 IFID ISSEX WB add r6,r4,r3 IFID ISSEX WB sw 0(r1),r6 IFID ISSWB sw -8(r1),r5 IFID ISSWB sub r2,r2,#16 IFID ISSEXWB
152
123456789101112131415161718 lw r3.0x10a IFIDISSEX WB addi r2,r0,#128 IFIDISSEXWB add r1,r0,0x0a IFID ISSEXWB lw r4,0(r1) IFID ISSEX WB lw r5,-8(r1) IFID ISSEX WB mult r6,r5,r3 IFID ISSEX WB add r5,r6,r3 IFID ISSEX WB add r6,r4,r3 IFID ISSEX WB sw 0(r1),r6 IFID ISSWB sw -8(r1),r5 IFID ISSWB sub r2,r2,#16 IFID ISSEXWB
153
En el siguiente código: ldf4,a bucle:ldf0, 0(r1) addf2, f4, f0 sdf2, 0(r1) addir1, r1, #8 subir2, r2, #1 bnezr2, bucle Si el procesador utiliza predicción dinámica de saltos con dos bits de historia, según el diagrama de estados que se indica a continuación, ¿Cuántos fallos de predicción se producen al ejecutar el código anterior si los bits de historia se inicializan a 00? No saltar (00) Saltar (10) No saltar (01) Saltar (11)
154
No saltar (00) Saltar (10) No saltar (01) Saltar (11) ldf4,a bucle:ldf0, 0(r1) addf2, f4, f0 sdf2, 0(r1) addir1, r1, #8 subir2, r2, #1 bnezr2, bucle r2 = 1 r2 = 3 r2 = 2 r2 = 1 r2 = 0 Penalización
155
No saltar (00) Saltar (10) No saltar (01) Saltar (11) ldf4,a bucle:ldf0, 0(r1) addf2, f4, f0 sdf2, 0(r1) addir1, r1, #8 subir2, r2, #1 bnezr2, bucle r2 = 2 r2 = 3 r2 = 2 r2 = 1 r2 = 0 Fallos = 1
156
No saltar (00) Saltar (10) No saltar (01) Saltar (11) ldf4,a bucle:ldf0, 0(r1) addf2, f4, f0 sdf2, 0(r1) addir1, r1, #8 subir2, r2, #1 bnezr2, bucle r2 = 3 r2 = 2 r2 = 1 r2 = 0 Fallos = 3
157
No saltar (00) Saltar (10) No saltar (01) Saltar (11) ldf4,a bucle:ldf0, 0(r1) addf2, f4, f0 sdf2, 0(r1) addir1, r1, #8 subir2, r2, #1 bnezr2, bucle r2 = n (n>3) r2 = n-1 r2 = n-2 r2 = n-3 … r2 = 0 Fallos = 3
158
En un programa, una instrucción de salto condicional (a una dirección de salto anterior) dada tiene el siguiente comportamiento en una ejecución de dicho programa: SSNNNSSNSNSNSSSSSN S : Se produce el salto N: No se utiliza el salto Calcule la penalización efectiva cuando: a) Predicción fija (siempre se considera que no se va a producir el salto) b) Predicción estática (si el desplazamiento es negativo se toma, y si es positivo, no) c) Predicción dinámica con dos bits, inicialmente en el estado (11). d) Predicción dinámica con tres bits, inicialmente en el estado (111). Nota: La penalización por saltos incorrectamente predichos es de 5 ciclos, y para los saltos correctamente predichos, 0 ciclos.
159
a) SSNNNSSNSNSNSSSSSN => S = 11 => 55 ciclos b) SSNNNSSNSNSNSSSSSN => S = 7 => 35 ciclos
160
a) SSNNNSSNSNSNSSSSSN => S = 11 => 55 ciclos b) SSNNNSSNSNSNSSSSSN => S = 7 => 35 ciclos
161
a) SSNNNSSNSNSNSSSSSN => S = 11 => 55 ciclos b) SSNNNSSNSNSNSSSSSN => S = 7 => 35 ciclos
162
c) 1110 01 00
163
c) 1110 01 00 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
164
c) 1110 01 00 SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
165
c) 1110 01 00 SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
166
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11
167
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11
168
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: NO SALTA 11
169
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11
170
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11
171
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11
172
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: NO SALTA 11
173
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente NO Salta 11
174
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente NO Salta Ocurre: SALTA 11
175
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11
176
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11
177
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11
178
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11
179
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11
180
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11
181
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11
182
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11
183
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11
184
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11
185
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11
186
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11
187
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11
188
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011111111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11
189
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011111111 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11
190
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111111110 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: SALTA 11
191
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111111110 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta 11
192
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111111100 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11
193
c) 10 01 00 SSNNNSSNSNSNSSSSSN 0011011111111000 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11
194
c) 10 01 00 SSNNNSSNSNSNSSSSSN 00110111111110000 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11
195
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111111100001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: NO SALTA 11
196
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111111100001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11
197
c) 10 01 00 SSNNNSSNSNSNSSSSSN 001101111111100001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11 11 saltos mal predichos 55 ciclos
198
111 011001 000 SSNNNSSNSNSNSSSSSN 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
199
111 011001 000 SSNNNSSNSNSNSSSSSN 0 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
200
111 011001 000 SSNNNSSNSNSNSSSSSN 00 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
201
111 011001 000 SSNNNSSNSNSNSSSSSN 001 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
202
111 011001 000 SSNNNSSNSNSNSSSSSN 0011 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
203
111 011001 000 SSNNNSSNSNSNSSSSSN 00110 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
204
111 011001 000 SSNNNSSNSNSNSSSSSN 001101 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
205
111 011001 000 SSNNNSSNSNSNSSSSSN 0011011 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
206
111 011001 000 SSNNNSSNSNSNSSSSSN 00110111 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
207
111 011001 000 SSNNNSSNSNSNSSSSSN 001101110 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
208
111 011001 000 SSNNNSSNSNSNSSSSSN 0011011101 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
209
111 011001 000 SSNNNSSNSNSNSSSSSN 00110111011 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
210
111 011001 000 SSNNNSSNSNSNSSSSSN 001101110111 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
211
111 011001 000 SSNNNSSNSNSNSSSSSN 0011011101111 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
212
111 011001 000 SSNNNSSNSNSNSSSSSN 00110111011110 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
213
111 011001 000 SSNNNSSNSNSNSSSSSN 001101110111100 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
214
111 011001 000 SSNNNSSNSNSNSSSSSN 0011011101111000 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
215
111 011001 000 SSNNNSSNSNSNSSSSSN 00110111011110000 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
216
111 011001 000 SSNNNSSNSNSNSSSSSN 001101110111100001 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta
217
111 011001 000 SSNNNSSNSNSNSSSSSN 001101110111100001 110100 010101 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta 10 saltos mal predichos 50 ciclos
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.