PROCESADORES SUPERESCALARES: MICRORQUITECTURAS Y PRINCIPIOS DE FUNCIONAMIENTO Integrantes: Cano Salas David Cruz Trujillo Iván Quispe Navarro Jordan Huanca.

Slides:



Advertisements
Presentaciones similares
Procesadores Superescalares
Advertisements

Pipelines: Riesgos.
Composición Interna de un Procesador
PLANIFICACIÓN DINÁMICA DE INSTRUCCIONES
Scheduling dinámico Algoritmo de Tomasulo.
3.4 PROCESAMIENTO DE LAS INSTRUCCIONES DE SALTO
Arquitectura de Computadoras (Taller) Semestre II de 2008.
Tema II Unidad de memoria. 2.1 Definiciones y conceptos básicos. 2.2 Jerarquía de memorias. 2.3 Memorias de semiconductor. 2.4 Memorias asociativas. 2.5.
¿Qué es un Diagrama de Flujo? UN DIAGRAMA DE FLUJO, TAMBIÉN LLAMADO FLUJOGRAMA DE PROCESOS O DIAGRAMA DE PROCESOS, REPRESENTA LA SECUENCIA O LOS PASOS.
El procesador Datapath y control. Universidad de SonoraArquitectura de Computadoras2 Introducción En esta parte del curso contiene: Las principales técnicas.
INTRODUCCION A LOS SISTEMAS DE COMPUTO ARQUITECTURA VON NEUMAN Ing. David Gonzalez.
Problemas Capitulo 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.
L. S. C. A. Raúl Monforte Chulin
Organización de computadoras
Operadores Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.
Procesadores superescalares
Microprocesador Estructura interna.
Pipelining Peligros de control.
Mecanismos de Comunicación usando Paso de Mensajes
Pipeline: Peligros de datos
U.T. 11: Introducción A Las Bases De Datos
El procesador Diseño del control.
UNIDAD CENTRAL DE PROCESO CPU.
Superescalares Scheduling estático.
Pipelining Datapath y control.
EL CPU.
ADMINISTRACíON DE LA MEMORIA EN SISTEMAS RECIENTES
Excepciones e interrupciones
Pipelining Peligros (hazards).
COMPUTADORA Una computadora es una colección de circuitos integrados  y otros componentes relacionados que puede ejecutar con exactitud, rapidez y de.
Datapath para las instrucciones de carga y almacenamiento (load/store)
HARDWARE POR: JOEL CASTAÑEDA 1ºA.
Comunicación Serial: Conceptos Generales
Unidad 7: Nivel Interno Algunos Conceptos Importantes
ARQUITECTURA DE HARD WARE COMPONENTES EN BLOQUES DEL PROCESADOR
Características en general de Pentium II. ESQUEMA Introducción. Pentium. Pentium II. Tipos de Pentium II. Características en general de Pentium II.
UNIVERSIDAD PRIVADA SAN JUAN BAUTISTA ESCUELA PROFESIONAL DE INGENIERIA DE COMPUTACION Y SISTEMAS TRANSACCIONES Integrantes: Cancho Ramirez Kiara Angulo.
Arquitectura 2013 Explicación 4.
LINEAS DE ESPERA.
LÓGICA DE PROGRAMACIÓN
Pipelining Introducción.
JAVIER ANDRES MARTÀ MARTINEZ CODIGO 37772
CODIFICACION DEL CANAL
Conceptos Relacionados Unidad I. Parte A.
CONTROLADORES DE MEMORIA DE COMPUTADORAS
HERRAMIENTAS DE PROGRAMACIÓN
P P AGINACION FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS FACULTAD DE INGENIERÍA INDUSTRIAL Y DE SISTEMAS.
8. Diseño del Procesador Fundamentos de los Computadores
Pipeline: Peligros de datos
ARQUITECTURA DEL COMPUTADOR Ing. Diana E. López.
Scheduling dinámico: algoritmo de Tomasulo
El entorno de Desarrollo de Dev-C++
Tema: Componentes lógicos de un ordenador. Mediante el sistema de numeración binario, es decir, usando los dígitos 0 y 1. Lo único que transmite,
Pipelining Peligros de control.
LICENCIATURA EN SISTEMAS COMPUTACIONALES EN ADMINISTRACION
1 TEMA 2: Organización de computadores Procesadores Memorias Dispositivos de E/S.
Estructura general de un programa. Estructura general de un programa. Pseudocódigo Diagrama de flujo Concepto de programas. Concepto de programas. Instrucciones.
Informática Ingeniería en Electrónica y Automática Industrial
MANTENIMIENTO DE LA CONSISTENCIA. BUFFER DE REORDENAMIENTO TIENE LA FINALIDAD DE VER LA PROBLEMÁTICA DE LA FINALIZACIÓN ORDENADA O DESORDENADA DE.
El procesador Datapath y control.
MÉTODO OWAS. INTRODUCCIÓN El método Owas permite la valoración de la carga física derivada de las posturas adoptadas durante el trabajo. A diferencia.
CONTROLES Y ESTRUCTURAS BÁSICAS DE PROGRAMACIÓN  1. Algoritmos: conjunto de instrucciones programadas para resolver una tarea específica.  2. Datos:
INTRODUCCIÓN A LA INFORMÁTICA
PROYECTO DE INVERSION Y EL CICLO DE PROYECTOS. CONCEPTOS DE PROYECTOS.
Pipelining Peligros de control.
Núcleo Lic. Gonzalo Pastor.
Ha llegado el momento de dar una mirada al interior de los Sistemas Operativos. En las siguientes secciones examinaremos cuatro estructuras distintas.
Diseñas y elaboras algoritmos para la solución de problemas
ARQUITECTURA DE UN MICROPROCESADOR. ESTRUCTURA BÁSICA DE UN SISTEMA MICROPROGRAMABLE A. Hardware CPU (chip microprocesador): es un circuito integrado.
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.
Transcripción de la presentación:

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.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.**

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)

El procesador dispone de dos unidades de procesamiento en coma flotante: una para la división y otra para la multiplicación.

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.

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).

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.

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.

Los primeros prototipos fueron estudiados por IBM a través de dos proyectos: Cheetah( ) 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.

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

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.

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.

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

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.

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

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.

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).

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.

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.

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.

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.

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.

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

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.

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 (1995)4

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

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

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

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

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

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 (1993) ALPHA (1995)

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)

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

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

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

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.

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

3.3.3 RENOMBRAMIENTO DE REGISTROS

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

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

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

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

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

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.

a) Buffer de renombramiento con acceso asociativo Asignació n valida Registro de destino ContenidoContenido valido Bit de asignación ultima …………… 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

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 ContenidoContenido Valido 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 r Indica si se ha hecho o no el renombramiento Apunta a la línea del buffer que renombra ese registro

Posible ubicación de un buffer de renombramiento en una microarquitectura superescalar con estaciones de reserva

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

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 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

Mult r2,r0,r1 Add r3,r1,r2 Sub r2,r0,r1 r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino mult 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

Add r3,r1,r2 Sub r2,r0,r1 r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult 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

r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult 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

r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult 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

r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult Cola de instrucciones Banco de registros Buffer de renombrado OCOS1/iS1VS1OS2/IS2VS2Rdestino OCOS1/iS1VS1OS2/IS2VS2Rdestino add 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

r00 r110 r220 r330 r440 r550 #EVDestValorValid a Ult 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

3.3.4 MANTENIMIENTO DE LA CONSISTENCIA. BUFFER DE REORDENAMIENTO

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

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.

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.

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

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)

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.

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.

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:

a. Detección de la instrucción de salto: cuanto antes se detecte que una instruc­ción es de salto antes puede empezar a procesarse como tal. De esta forma se puede reducir la posible penalización que ocasionan estas instruccio­nes 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.

Detección anticipada Además de utilizarse la decodificación paralela, se analizan las últimas líneas de la cola de instruc­ciones 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.

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.

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 ins­trucciones 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.

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

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.

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.

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

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.

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.

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

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.

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.

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.

RAMIFICACIÓN MULTICAMINO

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)

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.

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.

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.

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

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.

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

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.

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.

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

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.

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.

Datos Resultados Resultados Si hay interrupciones Unidades funcionales ROB Registros de la arquitectura Banco de registros De futuro

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

PROBLEMAS

Ciclo 3:Llegada de i1 a la estación de reserva Renombramiento de F3 como Fr1.

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.

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.

Ciclo 9: Finalización de i1. Escritura de resultado en Fr1 y copia a estaciones de reserva para emisión de i2 e i3.

Ciclo 10: Emisión de i2 e i3. Liberación de Fr1.

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.

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.

Ciclo 13:Finalización de i4. Escritura de resultado en Fr4.

Ciclo 14: Escritura de Fr4 en F5. Liberación de Fr4.

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:

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]

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]

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:

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]

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]

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:

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

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]

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]

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]

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]

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]

¿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)

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, …

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?

¿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) 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

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

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.)

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

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

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)

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

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

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

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

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.

a) SSNNNSSNSNSNSSSSSN => S = 11 => 55 ciclos b) SSNNNSSNSNSNSSSSSN => S = 7 => 35 ciclos

a) SSNNNSSNSNSNSSSSSN => S = 11 => 55 ciclos b) SSNNNSSNSNSNSSSSSN => S = 7 => 35 ciclos

a) SSNNNSSNSNSNSSSSSN => S = 11 => 55 ciclos b) SSNNNSSNSNSNSSSSSN => S = 7 => 35 ciclos

c)

c) Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

c) SSNNNSSNSNSNSSSSSN 0 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN 00 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN 001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN 001 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11

c) SSNNNSSNSNSNSSSSSN 0011 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN 0011 Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente NO Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente NO Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente NO Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Definitivamente Salta Ocurre: NO SALTA 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta 11

c) SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta Predice: Probablemente Salta saltos mal predichos  55 ciclos

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta

SSNNNSSNSNSNSSSSSN Definitivamente Salta Probablemente Salta Probablemente NO Salta Definitivamente NO Salta 10 saltos mal predichos  50 ciclos