1 Capítulo 14. Segmentación. El procesador tiene registros de segmentación entre etapas, todas las instrucciones pasan por las mismas etapas, y a medida en que se avanza por la cañería se va propagando el control de las transferencias asociado a cada instrucción. Se ejecutan varias instrucciones, que usan recursos diferentes, en forma simultánea. Se comienza la próxima instrucción mientras se trabaja aún en otra. La velocidad de avance está limitada por la etapa más lenta. Si las etapas no están balanceadas en tiempo, se reduce la velocidad. Durante el llenado y vaciado la velocidad de ejecución de instrucciones es más lenta. La velocidad puede degradarse si existen dependencias. 14.1 Etapas: Búsqueda de Instrucción. Decodificación. Lectura Registros. Ejecución. Operación con memoria de datos. Post-escritura en arreglo de registros. (BI) (Dec) (Eje) (Mem) (WR) La ejecución de instrucciones puede representarse por el siguiente diagrama, donde cada renglón representa una instrucción y hacia la derecha se muestra la evolución de la ejecución individual: tiempo BI Dec BI Eje Dec BI Me Eje Dec WR Me Eje WR Me WR flujo de ejecución Figura 14.1 Flujo de ejecución de instrucciones. La siguiente figura ilustra las diferencias en las ejecuciones de las instrucciones en procesadores monociclo, multiciclo y segmentado: Profesor Leopoldo Silva Bijit 13-11-2008 2 Estructuras de Computadores Digitales Reloj Monociclo Monociclo Load Add Store Reloj Multiciclo y pipeline 1 Multiciclo BI Dec Eje Me W R BI Dec Eje Me WR BI Dec Eje Me WR BI Dec Eje Me Dec Eje BI Me BI Dec 2 Pipeline WR Figura 14.2 Diferentes flujos de ejecución de instrucciones. En la ejecución monociclo, el período del reloj lo establece la instrucción que más demora en ejecutarse. A la vez este período es la suma de los tiempos asociados a cada etapa. En el diagrama los tiempos de acceso a memoria de instrucciones y de datos se asumen iguales y levemente mayores que la operación de la unidad aritmético lógica; la lectura y escritura de registros, se asumen iguales y menores que el tiempo de propagación en la alu. En la ejecución multiciclo, el período del reloj lo establece la etapa que más demora en realizarse (acceso a memoria). En el diagrama se aprecia que la instrucción load word demora más en ejecutarse en la máquina multiciclo. Sin embargo la instrucción store word demora menos, y también es más rápida la ejecución de la secuencia lw, sw, en el procesador multiciclo (el marcador uno ilustra esta diferencia). En la ejecución segmentada o en cañería (pipeline), asumiendo que cada instrucción ocupa las cinco etapas, la realización individual de una de ellas demora lo mismo que la más lenta en la ejecución multiciclo. Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 3 Se aprecia que es más rápida la ejecución de la secuencia lw, sw, en el procesador segmentado que en el multiciclo (el marcador dos ilustra esta diferencia). Ejemplo: Calcular el tiempo de ejecución, en los diferentes tipos de procesadores, suponer que se ejecutan 100 instrucciones: ° Procesador monociclo • 45 ns/ciclo x 1 CPI x 100 inst = 4500 ns ° Procesador Multiciclo • 10 ns/ciclo x 4.6 CPI (debido a la mezcla) x 100 inst =4600 ns ° Segmentada ideal • 10 ns/ciclo x (1 CPI x 100 inst + 4 ciclos llenado) = 1040 ns Si T es la duración de la etapa más lenta. Con n etapas: I instrucciones demoran: T* ( I + (n-1) ) llena Figura 14.3 Cálculo del tiempo de ejecución en procesador segmentado. En el diseño de un procesador segmentado se desea mejorar la velocidad de ejecución de una gran cantidad de instrucciones, en lugar de optimizar la ejecución individual de las instrucciones. La segmentación ocupa los recursos que ya están en el procesador, sólo agrega algunos registros para efectuar la segmentación y propagar el control. Profesor Leopoldo Silva Bijit 13-11-2008 4 Estructuras de Computadores Digitales El siguiente diagrama ilustra la ejecución de instrucciones: tiempo (ciclos de reloj) Instrucción 1 Cuando la instrucción 1 está en escritura de registros WR, la 2 está en Memoria de datos; Instrucción 2 Instrucción 3 la 3 está en Ejecución en Operaciones; la 4 está en decodificación y lectura de registros; Instrucción 4 la 5 está en la etapa de búsqueda de instrucción. Instrucción 5 orden de ejecución todas las etapas están ejecutando una instrucción diferente en un mismo ciclo. Figura 14.4 Ejecución de instrucciones en procesador segmentado. Multiciclo versus segmentación. En un procesador multiciclo interesa que el número de etapas o microciclos sea mínimo para cada una de las instrucciones. Esto disminuye el CPI promedio. En un procesador segmentado interesa disminuir las detenciones debidas a conflictos. En un camino segmentado las cinco unidades funcionales independientes son: Memoria de instrucciones para la etapa de búsqueda. BI (fetch). Puertas A y B de lectura del arreglo de registros para la etapa de Decodificación y Lectura de Registros. Reg/Dec. Unidad aritmético-lógica para la etapa de Ejecución. Ejec. Memoria de Datos para la etapa de acceso a memoria. Mem. Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 5 Puerta de escritura del arreglo de Registros para la etapa de postescritura. Wr. 14.2. Análisis de las etapas requeridas por las diferentes instrucciones. 14.2.1. Load. La instrucción Load requiere pasar por las cinco etapas: lw $t1, 0($t2) R L M I M I lw $t4, 0($t5) tiempo M D R L M D M I lw $t3, 0($t3) M D R L Orden de ejecución Figura 14.5 Ejecución de instrucción Load. No hay conflictos de escritura, ya que el arreglo de registros se emplea para escritura en ciclos diferentes. Tampoco de lectura ya que las instrucciones leen registros que permanencen con sus contenidos sin cambios. Sin embargo la secuencia: lw $t1, 0($t2) lw $t4, 0($t1) requiere usar $t1, que aún no ha sido escrito. 14.2.2. Instrucciones de tipo R. En un procesador multiciclo las instrucciones de tipo R requieren cuatro etapas. Si se introducen en la cañería secuencias de lw y de tipo R (con cuatro etapas), se produce un riesgo estructural. Dos instrucciones intentan escribir en la única puerta de escritura del arreglo de registros en el mismo tiempo. add $t1, $t2, $t3 lw $t4, 0($t5) add $t3, $t3, $t2 M I tiempo R L M I R L M I M D R L Orden de ejecución Figura 14.6 Ejecución de instrucción de tipo R, en cuatro etapas. Profesor Leopoldo Silva Bijit 13-11-2008 6 Estructuras de Computadores Digitales Una solución es insertar una operación nop entre un lw y una de tipo R. Se producen cinco etapas nulas. Lo que degrada la velocidad de ejecución de instrucciones. Otra solución es detener la ejecución (stall) de la ejecución de una instrucción de tipo R siguiente a un lw, insertando una burbuja. add $t1, $t2, $t3 M I M I lw $t4, 0($t5) tiempo R L R L M I add $t3, $t3, $t2 M D R L Orden de ejecución Figura 14.7 Ejecución de instrucción de tipo R, con detención. Esta solución requiere una lógica de control que resulta compleja. Se prefiere escoger la solución de insertar un ciclo de memoria nulo en las instrucciones de tipo R. Esto implica que las instrucciones de tipo R durarán 5 ciclos. add $t1, $t2, $t3 lw $t4, 0($t5) add $t3, $t3, $t2 M I M I tiempo M D R L R L M I M D R L M D Orden de ejecución Figura 14.8 Ejecución de instrucción de tipo R, con ciclo de memoria nulo. 14.2.3. Instrucción sw Para la ejecución de la instrucción store word, en un procesador multiciclo, se requieren cuatro etapas. En la ejecución en la cañería no es necesario agregar un ciclo nulo de postescritura, para la instrucción store, ya que en este caso se libera el recurso (escritura en el arreglo de registros). Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 7 sw $t1, $t2, $t3 M I lw $t4, $t1, $t2 sw $t3, $t3, $t2 R L tiempo M D R L M I M D R L M I M D Orden de ejecución Figura 14.9 Ejecución de instrucción store word. 14.2.4. Bifurcación. La bifurcación requiere cuatro etapas, si se determina la igualdad empleando la condición cero generada por la ALU, durante la etapa de memoria de datos (nula obviamente) se actualiza el valor de PC si debe efectuarse la bifurcación. Nuevamente no se requiere la etapa de postescritura ya que no se usa el recurso; también la etapa nula de memoria no ocasiona riesgos con la ejecución de otras instrucciones. beq $t1, $t2, rótulo M I R L tiempo M D Orden de ejecución Figura 14.10 Ejecución de instrucción de bifurcación, en cuatro etapas. Para disminuir los riesgos de control es mejor solución detectar la igualdad en la etapa de decodificación y lectura del arreglo de registros y actualizar el valor de PC, en caso de que se efectúe la bifurcación en la misma etapa. En este caso el beq libera el recurso ALU y memoria. beq $t1, $t2, rótulo M I R L tiempo Orden de ejecución Figura 14.11 Ejecución de instrucción de bifurcación, en dos etapas. Se elige esta opción, en la cual la bifurcación requiere dos ciclos para completarse. Un razonamiento análogo se emplea para el salto incondicional (jump). Se actualizará PC en la etapa de decodificación y lectura de registros. En este caso se libera el arreglo de registros, ya que no se emplea. Profesor Leopoldo Silva Bijit 13-11-2008 8 Estructuras de Computadores Digitales M I j rótulo tiempo R L Orden de ejecución Figura 14.12 Ejecución de instrucción de salto dos etapas. 14.3. Problemas de la segmentación. Riesgos de segmentación. 14.3.1. Clasificación de riesgos de datos. Sea i una instrucción que entrará ha ser procesada y j una instrucción anterior que está en la cañería, con Rregs( i ) el conjunto de registros que son empleados en lectura y Wregs( i ) el conjunto(en el repertorio MIPS, es un solo registro) de registros en que se escribe en la instrucción i, entonces: ° Existe un riesgo Read after Write en el registro r si: r Rregs( i ) Wregs( j ) ° Existe un riesgo Write after Write en el registro r si: r Wregs( i ) Wregs( j ) ° Existe un riesgo Write after Read en el registro r si: r Wregs( i ) Rregs( j ) El siguiente diagrama ilustra los tipos de riesgos: BI De c BI Eje Me De c BI Eje flujo de ejecución De c BI W R tiempo RAW W R Me Eje BI Me De c WAW W R Dec Eje Eje Me Me W R W R Figura 14.13 Tipos de riesgos. El riesgo de tipo RAW (read after write) consiste en leer después de escribir, produce conflicto de datos, ya que se lee el valor anterior de un registro. El riesgo WAW (write after write) consiste en es escribir después de escribir. Se ilustra con un tiempo largo de acceso a la memoria de datos. Produce la sobre escritura de un registro con un valor anterior Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 9 El riesgo WAR (write after Read) escribe después lee, se ilustra con una etapa larga de decodificación, y produce el leer el valor futuro de un registro, no usando el valor presente. 14.3.2. Tipos de riesgos(hazards) Estructurales: Se intenta usar el mismo recurso de dos maneras diferentes, en el mismo tiempo. Conflicto de datos: Se intenta usar un dato antes de que sea válido. Ocurre cuando una instrucción depende de un dato que escribe una instrucción previa que también está en la cañería. Conflicto de Control: Se intenta efectuar una decisión antes de que la condición o flag sea válida. Todos los riesgos pueden resolverse esperando. Es decir, impidiendo que se ejecuten las etapas de las siguientes instrucciones, hasta que se resuelva el conflicto. La unidad de control del procesador segmentado debe detectar los riesgos, y tomar acciones para solucionar los conflictos. Ejemplo de riesgo estructural. Usar, en forma compartida, una memoria para datos e instrucciones provoca un riesgo estructural. Por ejemplo, la instrucción load, en su etapa de lectura de memoria, y el fetch de la instrucción 4, intentan leer al mismo tiempo la única memoria. La siguiente secuencia de ejecución de instrucciones ilustra un conflicto estructural: M I Load word R L M I Instrucción 2 R L M I Instrucción 3 M D R L M I Instrucción 4 tiempo M D M D R L M I Instrucción 5 M D R L M D Orden de ejecución Figura 14.14 Ejemplo de riesgo estructural. En las unidades de memoria y registros, se sombrea la parte derecha para indicar que se está leyendo el recurso; y se sombrea a la izquierda para indicar que se está escribiendo en el recurso. Profesor Leopoldo Silva Bijit 13-11-2008 10 Estructuras de Computadores Digitales Ejemplo de Riesgo de Control. En el siguiente camino multiciclo, y con registros de segmentación: Figura 14.15 Ejemplo de riesgo de control. La bifurcación se resuelve después de la etapa de ejecución; es decir se escribe en PC la dirección de salto en la etapa de memoria, si es que se cumple la condición para realizar el salto. La bifurcación puede realizarse o no. En caso de tomar la bifurcación ya habrán ingresado a la cañería las dos instrucciones siguientes a la bifurcación y comenzado a ejecutarse; si no se efectúa la bifurcación, ya se tendrá adelantada la ejecución de las instrucciones siguientes a la bifurcación. beq $t1, $t2, loop add $t3, $t4, $t5 add $t3, $t6, $t3 add $t3, $t8, $t7 M I R L M I tiempo M D R L M I M D R L M I este fetch es seguro M D R L M I M D R L M D Orden de ejecución Figura 14.16 Ejemplo de riesgo de control, en bifurcación en cuatro etapas. Se puede solucionar este riesgo de control, deteniendo el procesamiento de las próximas instrucciones hasta que la decisión pueda efectuarse. Esto implica tres ciclos de reloj de Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 11 detención (stall) por cada branch. No puede efectuarse fetch: durante la etapa de decodificación, durante la etapa de cálculo del flag de cero a la salida de la alu de la instrucción beq, y durante la escritura de PC de la instrucción beq que se efectúa en la etapa mem; sólo en la etapa WR de la instrucción beq puede efectuarse confiablemente el fetch de la instrucción siguiente. La detención puede lograrse evitando leer la memoria de instrucciones, mediante la deshabilitación de WE IR y desactivando las señales de control que modifican el estado del procesador (WrReg, MemWr); o bien, limpiando el registro IR en la etapa de decodificación del beq. Esto intercala burbujas en la cañería. Lo cual se ilustra en el siguiente diagrama: beq $t1, $t2, loop M I R L tiempo M D burbuja burbuja burbuja M I este fetch es seguro R L M D Orden de ejecución Figura 14.17 Inserción de burbujas. Ésta es una solución por hardware; también puede delegarse la tarea de detención al compilador, el que debe intercalar tres instrucciones nop (no operación) después de cada beq; el diagrama que representa esta situación es similar al visto antes, pero se está ejecutando la instrucción nop. El texto assembler, modificado por el compilador, para asegurar la ejecución sin riesgos de control en la cañería es el siguiente: beq nop nop nop add add add $t1, $t2, loop $t3, $t4, $t5 $t3, $t6, $t3 $t3, $t8, $t7 Profesor Leopoldo Silva Bijit #este fetch es seguro. 13-11-2008 12 Estructuras de Computadores Digitales 14.3.3. Solución de riesgo de control anticipando la comparación. Puede mejorarse el diseño de la cañería, anticipando la comparación, para esto es preciso agregar hardware, que permita generar la condición "equal" en la etapa de decodificación y a la vez escribir el valor de PC. En este caso: beq $t1, $t2, loop M I add $t3, $t4, $t5 este fetch es seguro R L M I tiempo M D R L M I M D R L M D Orden de ejecución Figura 14.18 Riesgo con bifurcación en dos etapas. Existen varias soluciones para este riesgo de control: 14.3.3.1. Detención. La solución por hardware consiste en detener por un ciclo el fetch de la instrucción siguiente a un branch. La solución por software consiste en intercalar un nop, después de cada branch. 14.3.3.2. Bifurcaciones retardadas. No se detiene la ejecución después de una bifurcación; es decir la instrucción siguiente a una bifurcación comienza a ejecutarse siempre. Esta solución (delayed branch) agrega un ciclo por cada branch, si el compilador no puede encontrar una instrucción que sea útil, y que pueda realizarse después del branch. 14.3.3.3. Vaciamiento. (flush) La tercera solución es efectuar el fetch, después del branch. Si el salto no se realiza, se continúa la ejecución. Si el salto se realiza, se debe descartar la instrucción leída y volver a efectuar el fetch. 14.3.3.4. Predicción de las bifurcaciones. Basado en la observación que en muchos lazos repetitivos, las bifurcaciones ocurren normalmente en el fondo de un bloque, y saltan hacia el inicio del bloque; puede predecirse que las bifurcaciones hacia atrás tienen mayor probabilidad de ser realizadas (ésta es una predicción estática). Un esquema más refinado es el de las predicciones dinámicas: se mantiene una máquina secuencial que recuerda si las bifurcaciones anteriores (una, dos o más) se han o no realizado; en caso de haberse efectuado las anteriores se asume que la próxima también se efectuará; en caso contrario se asume que no efectuará la bifurcación. En caso de que la Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 13 suposición de no efectuarla sea incorrecta, el control debe modificar las instrucciones siguientes a la de la bifurcación o salto para no afectar la integridad de los datos. Si el número de etapas de la cañería es muy largo se tiende a emplear la predicción dinámica del flujo de ejecución. El primer procesador MIPS empleó la solución por software, de intercalar nops después de los saltos y bifurcaciones. La siguiente versión empleó el diseño de efectuar siempre la siguiente instrucción después de un salto o bifurcación (así está implementado el simulador SPIM, en modo raw, realiza bifurcaciones retardadas en una instrucción). 14.3.4. Más sobre bifurcaciones retardadas (Delayed Branches). En un procesador MIPS la instrucción después de un branch se ejecuta siempre, aún cuando se efectúe la bifurcación. En el simulador esto se logra en modo "raw". La máquina virtual MIPS (modo no raw) no ejecuta la instrucción siguiente a la bifurcación. Esta interpretación de las bifurcaciones permiten al compilador generar código para usar más eficientemente la segmentación. Por ejemplo, en el siguiente texto, el addi después del beq se ejecuta aún cuando se efectúe la bifurcación: .text .globl main main: rótulo: addi beqz addi ...... slt $t2, $zero,0 $t1, rótulo $t2, $t0, 1 ;se ejecuta siempre $t1, $t0, $t3 Al finalizar la etapa de decodificación del branch, se conoce si el salto tendrá o no lugar. Sin embargo, ya se habrá realizado el fetch de la instrucción siguiente no importando si se realiza o no el salto. La mitad de las veces un compilador puede encontrar una instrucción útil para colocar después de un branch, esto en promedio. Si no puede encontrar una instrucción debe intercalar una instrucción que no haga nada (nop). Una técnica para rellenar los huecos en la cañería es que el compilador intercale un nop después de cada branch, y luego intente reemplazar el nop por una instrucción que pueda adelantarse. Para esto existen diversas opciones: a) Para encontrar una instrucción que se pueda ejecutar después del branch, se mueve hacia el rótulo y se observa si la instrucción puede moverse en forma segura (que no haya riesgos), si es Profesor Leopoldo Silva Bijit 13-11-2008 14 Estructuras de Computadores Digitales posible ésta reemplaza al nop. El segmento siguiente ilustra el procedimiento, con una bifurcación hacia adelante. rótulo: addi beqz NOP ... addi slt $t2, $zero,0 $t1, rótulo $t2, $t0, 1 $t1, $t0, $t3 El addi puede moverse ya que no tiene conflictos. El texto quedaría igual al que se mostró antes. Esto es en caso de bifurcaciones hacia adelante; existe un procedimiento similar cuando la bifurcación es hacia atrás. b) Otra opción es rellenar el nop(intercalado en una primera etapa por el compilador), con una instrucción que se encuentre antes de la bifurcación. En el ejemplo, el addi que está antes de la bifurcación, no tiene riesgos y puede moverse, quedando: rótulo: beqz addi ... addi slt $t1, rótulo $t2, $zero,0 ; una que está antes rellena el hueco. $t2, $t0, 1 $t1, $t0, $t3 No es tan difícil encontrar instrucciones para rellenar el hueco si existen instrucciones de punto flotante, ya que éstas emplean registros separados del procesador central. Otra técnica empleada, por los compiladores, para mejorar el tratamiento de las detenciones por riesgos de control, es aumentar el tamaño de los bloques de instrucciones que se repiten. Una iteración puede desenrollarse; es decir efectuar el paso i y el i+1(o más pasos, si es posible) dentro del bloque, lo cual disminuye el número de bifurcaciones promedio realizadas para ejecutar el lazo. 14.3.5. Conflicto de datos en operaciones de tipo R o inmediatas. Estudiemos la ejecución de cinco instrucciones de tipo R. El primer add escribe en $t1 en la etapa WR. Las tres instrucciones siguientes tienen conflictos de dependencia de datos, ya que usan un valor que aún no ha sido escrito. Esto puede detectarse en los diagramas, observando las líneas hacia atrás en el tiempo. El and, que es la cuarta instrucción después del add, no tiene riesgos en $t1 (puede detectarse por una línea hacia delante en la cañería). Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 15 M I add $t1, $t2, $t3 R L R L M I add $t4, $t1, $t2 tiempo M D M D R L M I sub $t2, $t3, $t1 M D M I or $t6, $t1, $t3 R L M D M I and $t2, $t1, $t1 R L M D Orden de ejecución Figura 14.19 Riesgo en secuencias de tipo R. Si el arreglo de registros se implementa con latchs transparentes el or (la tercera después del add) no tendría conflicto en $t1. Ya que se puede leer y escribir en el mismo registro, en el mismo ciclo del reloj. En este tipo de registros la salida se modifica cuando cambia la entrada (modo transparente), entonces lo que se escriba es lo que comienza a salir. La solución de los conflictos de datos, puede realizarse mediante la anticipación de los datos. Esto considerando que el dato que será escrito en un registro por una instrucción de tipo R o de tipo inmediata, ya está disponible en la cañería después de terminada la etapa de operaciones. También dicho valor está disponible al terminar el ciclo de memoria (nulo en este caso, ya que la instrucción de tipo R o inmediata no emplea la memoria). Esto implica modificar la ruta de datos, para que la alu pueda adquirir sus datos de entrada desde la salida de la alu, o desde la salida de la memoria. add $t1, $t2, $t3 add $t4, $t1, $t2 sub $t2, $t3, $t1 or $t6, $t1, $t3 and $t2, $t1, $t1 M I R L M I tiempo M D R L M I M D R L M I M D R L M I M D R L M D Orden de ejecución Figura 14.20 Solución de riesgos mediante anticipación. Profesor Leopoldo Silva Bijit 13-11-2008 16 Estructuras de Computadores Digitales Se detecta el conflicto de datos de las instrucciones siguientes que lean registros con una que escriba en registros (de tipo R o inmediata pero no de tipo load word), estando la instrucción que escribe en registros en operaciones y la que le sigue en decodificación, si el registro destino (se denomina RD más adelante) de la que está en operaciones es igual al campo rs o rt de la que está en decodificación. En este caso, mediante muxes, debe escribirse la salida de la alu en el registro A (en lugar del busA) si el conflicto es con rs; o en el registro B (en lugar del busB) si el conflicto es con rt. Puede detectarse que la que está en operaciones es de tipo R o inmediata, ya que debe tener MemRd y MemWr iguales a cero y RegWr igual a uno. Si se tiene en la etapa nula de memoria una operación de tipo R o inmediata que escribirá en un registro (que se denomina RD1 más adelante), y en decodificación una operación de tipo R cuyo campo rs o rt sean iguales a RD1, deberá anticiparse la salida de la etapa memoria hacia el registro A o B, dependiendo de si el conflicto es con rs o rt, respectivamente. Puede detectarse que la que está en memoria es de tipo R o inmediata, ya que debe tener MemRd1 y MemWR1 iguales a cero y RegWr1 igual a uno. Si en la etapa de operación y de memoria existen instrucciones que escriban en un registro que deba ser leído por la instrucción que está en decodificación, debe adelantarse el dato que está a la salida de la alu, por ser el más reciente. En el diagrama, que se mostró anteriormente, se ilustran las anticipaciones desde la salida de la alu(del valor de $t1) y de la salida de la memoria(con el valor de $t1) hacia la entrada de la alu de las instrucciones siguientes. También se muestra, el efecto anticipatorio, del uso de registros en base a latchs transparentes. 14.3.6. Conflicto de datos en transferencias. La anticipación de datos hacia la unidad de operaciones resuelve los riesgos para instrucciones de tipo R o inmediatas, pero los conflictos de datos en las transferencias no pueden anticiparse, como se ilustra a continuación. lw $t1, 0($t2) add $t3, $t1, $t5 M I R L M I tiempo M D R L M D Orden de ejecución Figura 14.21 Riesgos en secuencia de transferencia. En una instrucción de carga el valor que será escrito en el registro destino está disponible en la cañería al terminar la etapa de memoria. Sin embargo, la instrucción siguiente al lw requiere leer el registro con riesgo de datos en el ciclo anterior. Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 17 La solución de este riesgo de datos es detener el ingreso de nuevas instrucciones(detención por hardware), o introducir nop(si se delega la detención al compilador), hasta resolver el conflicto. Si se anticipa la salida de la memoria como entrada a la alu (como se muestra en el diagrama anterior), es preciso detener en un ciclo; sin esta anticipación la detención es de dos ciclos. Detención por hardware. El siguiente diagrama ilustra la detención por hardware(stall) de la instrucción siguiente a un load word, pudiendo ser ésta una de tipo R, bifurcación o store word, pero que lea el registro en el que escribe la instrucción load word. M I lw $t1, 0($t2) add $t3, $t1, $t5 R L M I R L M I inicio fetch siguiente R L M I repite fetch siguiente tiempo M D M D R L M D Orden de ejecución Figura 14.22 Detención por hardware. Nótese que cuando el load word está en operaciones y la siguiente en decodificación se puede detectar el riesgo, y detener (en ese ciclo) la actualización del registro IR y del registro PC. De esta forma cuando lw está en memoria: se anula la etapa de operación (se indica con una burbuja, la cual debe deshabilitar los controles que modifican el estado del procesador: MemWr y RegWr); como IR no cambió sigue estando la operación add en decodificación, y como PC no cambió, vuelve a realizarse el fetch de la instrucción siguiente al add. El diagrama anterior ilustra el uso de las etapas en el tiempo por cada instrucción en ejecución (en cada ciclo del reloj deben estar presentes todas las etapas). Existe una forma alternativa de emplear el diagrama, mostrando la ejecución individual de las instrucciones en el tiempo, en este caso cada línea horizontal muestra la ejecución individual en las etapas. Esto se muestra a continuación. Profesor Leopoldo Silva Bijit 13-11-2008 18 Estructuras de Computadores Digitales M I lw $t1, 0($t2) R L M I add $t3, $t1, $t5 proceso siguiente inst. tiempo M D R L R L M I M I M D R L M D Orden de ejecución Figura 14.23 Ejecución individual de instrucciones. En el diagrama anterior se muestra que al final del ciclo de operación del load word, se detiene el procesamiento del add(no se actualiza IR) y la instrucción siguiente(no se cambia PC). Cuando el load word entra a su ciclo de memoria, se repite la decodificación del add y el fetch de la siguiente al add. El esquema no muestra la etapa de operación nula en el ciclo en que se procesa en memoria el load word. Solución por software. El siguiente diagrama ilustra la solución por software, en la cual el compilador intercala una operación nop, después de cada load word. lw $t1, 0($t2) nop add $t3, $t1, $t5 M I R L M I tiempo M D R L M I M D R L M D Orden de ejecución Figura 14.24 Solución por software. Después del load word, el compilador inserta una operación nop, y ésta se ejecuta en la cañería. La decodificación de la operación nop, debe deshabilitar los controles de escritura en registro y en memoria. Si la siguiente instrucción al nop, lee un registro que aún no se ha escrito, puede anticiparse el valor del contenido del registro en conflicto, que ya está a la salida de la memoria y escribirlo en el registro A (en el caso del ejemplo); en lugar de lo leído en la etapa de decodificación por la instrucción(ubicada dos líneas más abajo que el load word). Esto explica que sólo sea necesario perder un ciclo del reloj, después de instrucciones load word que tengan conflictos de datos. Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 19 Secuencia lw seguida de sw. Una excepción a lo anterior es la secuencia lw seguida de un sw que puede resolverse, en caso que el registro en que escribe lw sea usado para escribir en la memoria en la instrucción store word. Esto se ilustra a continuación: M I lw $t1, 0($t2) R L M I sw $t1, 0($t3) tiempo M D R L M D Orden de ejecución Figura 14.25 Secuencia lw seguida de sw. Igual situación sucede en secuencias de instrucciones que escriban en un registro (tipo R o inmediatas) seguidas de un store word que emplea el contenido de ese registro para escribir en la memoria. Para resolver este riesgo se requiere anticipar desde la salida de la memoria hacia el registro D (en el diagrama que se verá más adelante) con el valor que será escrito en la siguiente etapa de memoria. Para esto debe poderse ingresar al bus de escritura de la memoria (mediante un mux) el contenido del busB y también la salida de la memoria (Mout), cuando se tenga en la etapa de operaciones un sw y en la etapa de memoria: una instrucción lw o de tipo R o inmediata, y se tenga conflicto en el registro que se escribe, con el que graba sw. Cargas retardadas. (Delayed Loads) Una forma de evitar las detenciones, en el caso de conflicto de datos de cargas (load) seguidas de operaciones de tipo R o bifurcaciones, es optimizar el orden de las instrucciones mediante el compilador. Se muestran las detenciones, debidas a cargas, para tres programas (un compilador C (gcc), un analizador de circuitos (spice), y un procesador de textos (tex) ) con y sin optimización. 70 60 50 % 40 detención30 20 10 0 Sin Con optimizar optimización gcc spice text Figura 14.27 Cargas retardadas para evitar detenciones. Profesor Leopoldo Silva Bijit 13-11-2008 20 Estructuras de Computadores Digitales En este caso el compilador intercala un nop después de cada load word que tenga conflictos con la instrucción siguiente. Y luego trata de reemplazarlo por una instrucción que no tenga conflictos, ubicada antes o después del load word. Las frecuencias de detención disminuyen apreciablemente, como puede observarse en el diagrama anterior. 14.4. Camino de datos y control. A continuación se muestra el camino de datos y el control para un procesador segmentado en cinco etapas. Se asume la detección de la igualdad en la etapa de lectura de registros, esto puede hacerse si el número de etapas de segmentación es reducido. Las señales de control se generan en la etapa de lectura de Registros y Decodificación, ciclo en el cual se sabe cuál instrucción debe ejecutarse. Las señales de control para la etapa de ejecución (ExtOpt, AluSrc, AluCtr) se emplean un ciclo después y son pasadas a dicha etapa a través del registro de segmentación, que separa las etapas. Las señales de control para la etapa de memoria (MemWr, MemRd, MemtoReg) son usadas dos ciclos más tarde. Las señales de control para la etapa de postescritura (RD, RegWr) se emplean tres ciclos después. RD es el número del registro en el que debe escribirse. El diagrama muestra el control y los datos fluyendo en la cañería. El camino no muestra los recursos necesarios para lograr detenciones, anticipaciones y descartes, para solucionar los riesgos, los que se verán más adelante. Camino de datos y control del procesador segmentado (pipeline). Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 21 PCsel COp funct rt rd IR PC Mem. Inst. Decodi ficador RegWr MemtoReg MemtoReg1 MemWr MemRd MemWr1 MemRd1 AluCtr AluSrc br j inm16 rs rt ExtOp Inm16a RegWr2 Opera ciones A Reg B M br j M S RD2 PC+4 RD2 RegWr2 RD1 RegWr1 RD D Mem. Dat. MDout equal inm16 add26 nPC Next PC Figura 14.28 Camino de datos en procesador segmentado. En un ciclo de reloj se activan simultáneamente las siguientes transferencias de control: RD1 = RD; RegWr1 = RegWr; MemtoReg1 = MemtoReg; MemWr1 = MemWr; MemRd1 = MemRd; RD2 = RD1; RegWr2 = RegWr1; A la vez se activan simultáneamente las siguientes transferencias en el camino de datos: /* etapa de búsqueda de instrucción */ IR = MI[PC]; nPC = PC + 4; if (PCsel==0) PC = PC+4; else PC = NextPC; /* riesgo control*/ /* etapa de decodificación */ if (Op == add) { AluCtr=”add” (010); AluSrc=”B”(0); ExtOp= ; MemRd = 0; MemWr=0; Memtoreg = “S” (0); RD= rd; RegWr =1; PCsel =”+4” (0) } Profesor Leopoldo Silva Bijit 13-11-2008 22 Estructuras de Computadores Digitales if (Op == sub) { AluCtr=”sub” (110); AluSrc=”B” (0); ExtOp= ; MemRd = 0; MemWr=0; Memtoreg = “S” (0); RD= rd; RegWr =1; PCsel ="+4" (0) } if (Op == slt) { AluCtr=”slt” (111); AluSrc="B" (0); ExtOp= ; MemRd = 0; MemWr=0; Memtoreg = “S” (0); RD= rd; RegWr =1 ; PCsel = "+4" (0) } if (Op == ori) { AluCtr=”or” (001); AluSrc="Op32" (1); ExtOp=”zero” (0); MemRd = 0; MemWr=0; Memtoreg = “S” (0); RD= rt; RegWr =1 ;PCsel = "+4" (0) } if (Op == lw) { AluCtr="add" (010); AluSrc="OP32) (1); ExtOp="sign" (1); MemRd = 1; MemWr=0; Memtoreg = "MDout" (1); RD= rt; RegWr =1; PCsel ="+4" (0) } if (Op == sw) { AluCtr="add" (010); AluSrc="Op32" (1); ExtOp="sign" (1); MemRd = 0; MemWr=1; Memtoreg = ; RD= rt; RegWr =0; PCsel ="+4" (0) } if (Op == beq) {br =1; j=0; /*Señal de control br */ AluCtr="nop" ( ); AluSrc= ; ExtOp= ; MemRd = ; MemWr=0; Memtoreg = ; RD= 0; RegWr =0 ; if(Equal) PCsel =1; else PCsel =0; } if (Op == j ) { br =0; j=1 ; /* Señal de control j */ AluCtr="nop" ( ); AluSrc= ; ExtOp= ; MemRd = ; MemWr=0; Memtoreg = ; RD= 0; RegWr =0; PCsel =1 } /* lectura de registros */ A = R[rs]; B = R[rt]; inm16a = inm16; /*escritura de registros */ if (RegWr2 ==1) R[RD2] = M; /* riesgo de datos*/ /* cálculo de direcciones de bifurcación y salto /* equal = (R[rs] == R[rt]); if ( (Op == beq) & equal ) NextPC = nPC + SignExt(inm16)*4; if ( Op == j) NextPC = nPC&F0000000 | (add26<<2); /* segmento de operaciones */ if (AluCtr="add" (010) & AluSrc="B" (0) ) S = A + B; if (AluCtr="sub" (110) & AluSrc="B" (0) ) S = A - B; if (AluCtr="slt" (111) & AluSrc="B" (0) ) if (A<B) S = 1;else S = 0; if (AluCtr="or" (001) & AluSrc="OP32" (1) & ExtOp="cero" (0) ) S = A or CeroExt(Inm16a); if (AluCtr="add" (010) & AluSrc="Op32" (1) & ExtOp="sign" (1) ) S = A + SignExt(Inm16a); D = B; /* dato a escribir en memoria en sw */ /* segmento memoria de datos */ if (MemRd1 ==1) M = MD[S]; if (MemWr1 ==1) MD[S] = D; Profesor Leopoldo Silva Bijit 13-11-2008 /* add /* sub /* slt */ */ */ /* ori */ /* lw y sw */ Segmentación 23 if (Memtoreg1=="S" (0 ) ) M = S; if (Memtoreg1=="Mdout" (1 ) ) M = MDout; 14.5. Solución de riesgos. 14.5.1. Unidad de anticipación de datos hacia la unidad de operaciones. El riesgo se detecta cuando en operaciones se tiene una instrucción de tipo R o inmediata que escriba en un registro (RD), y en decodificación una instrucción que lea el registro rs (add, sub, ori, beq, lw) o que lea el registro rt (add, sub, beq). Nótese que no se considera en ningún grupo a la instrucción store word que también lee rs y rt, ya que este riesgo se trata aparte. También existe riesgo cuando en etapa de memoria se tiene una de tipo R o inmediata y en decodificación una instrucción que lee rs o rt, con igual valor al del registro en que se escribirá (RD1). Para solucionar por anticipación de datos hacia la unidad de operaciones se requiere agregar muxes a las entradas de la alu, que permitan ingresar las salidas de la alu y de la memoria, además de los contenidos de los buses de salida del arreglo de registros (busA y busB). Para detectar que la operación que está en la etapa de operaciones sea de tipo R o inmediata se tiene la siguiente condición: TipoRI = (MemWr==0) & (MemRd==0) & (RegWR==1) Para detectar que la operación que está en la etapa de memoria sea de tipo R o inmediata se tiene la siguiente condición: TipoRI1 = (MemWr1==0) & (MemRd1==0) & (RegWR1==1) Las instrucciones que leen el registro con campo rs son: add, sub, ori, lw y beq. Exceptuando la instrucción sw que se trata aparte. Las instrucciones que leen el registro con campo rt son: add, sub y beq. Exceptuando la instrucción sw que se trata aparte. Notar que las inmediatas escriben en el registro indicado por el campo rt, también lw escribe en R[rt]. Los controles de los muxes se diseñan según: if (TipoRI ) & (lee_rs) & (rs == RD ) A = Aluout; /*AntA = 1 */ if (TipoRI1) & (lee_rs) & (rs == RD1) A = Mout; /*AntA = 2 */ if (MemRd1==1) && (Cop==”sw”) &&(rs == RD1) A = Mout; en el resto de los casos A = R[rs]; /*AntA = 0 */ if (TipoRI ) & (lee_rt) & (rt == RD ) if (TipoRI1) & (lee_rt) & (rt == RD1) en el resto de los casos B = R[rt]; Profesor Leopoldo Silva Bijit B = Aluout; /* AntB = 1 */ B = Mout; /* AntB = 2 */ /* AntB = 0 */ 13-11-2008 24 Estructuras de Computadores Digitales 14.5.2. Anticipación de escritura en memoria. Las instrucciones que escriben en un registro, seguidas de un store word que escriba el contenido del registro que aún no se ha grabado, no requieren detener la ejecución de la escritura en memoria si se adelanta la salida de la etapa de memoria (Mout) en el registro de segmentación que almacena el valor que será escrito en la memoria (D). El riesgo se detecta cuando la instrucción que escribe en registro está en la etapa de memoria y el store word en operaciones; y si el número del registro cuyo contenido debe escribirse en memoria (RD) es igual al número del registro en que escribirá la instrucción que está en etapa de memoria (RD1). La señal que controla el mux que anticipa datos, para escritura en memoria, se diseña según: if ( (MemWr == 1) & (RegWr1==1) & (RD==RD1 ) ) D = Mout; /* AntM = 1 */ en el resto de los casos D = B /* AntM = 0 */ Esto considerando que en la decodificación de sw se almacena en el registro destino(RD) el valor del campo rt. 14.5.3. Detención de un ciclo en secuencias: lw-alu Esta solución impide la optimización a nivel del compilador de intercalar un nop e intentar sustituirlo por una instrucción que no genere conflicto con el load word. Se detecta el riesgo cuando el lw está en operaciones (MemRd en 1) y la instrucción que le sigue (que lea el registro en el cual el lw escribe) en decodificación. La condición para la detención está separada en dos partes: Primero las secuencias lw seguidas por instrucciones que leen el registro rs (tipo R, transferencias, inmediatas y beq); que se detectan por: (MemRd == 1) & ( OP != j) & ( rs ==RD) En segundo lugar las secuencias lw seguidas de instrucciones que leen el registro rt(tipo R y beq) que se detectan según: (MemRd == 1) & (Op==tipoR | Op==beq ) & ( rt ==RD) Si la instrucción siguiente es otro load word no produce riesgos, ya que escribe en rt después del anterior (lo sobreescribe). Si la siguiente instrucción es store word, emplea el contenido de rt para escribir en la memoria y puede solucionarse. Las instrucciones inmediatas no leen en registro rt; lo usan para escribir el resultado. Juntando las dos condiciones, se tiene: if ( ( MemRd == 1) & ( Op != j) & ( rs ==RD) | ( MemRd== 1)& ( Op==tipoR | Op==beq) & (rt ==RD) ) { burbuja = 1; válido = 0;} Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 25 en el resto de los casos burbuja = 0; válido =1; La señal burbuja debe detener el reloj en PC e IR o inhabilitar los write enable de esos registros (WEPC =0; WEIR = 0), esta última es mejor solución electrónica. También debe escribir en la señal de control válido un 0, para propagar una acción nula (o burbuja) en la cañería. Entonces: válido = ( burbuja) 14.5.4. Descarte(flush) en caso de saltos incondicionales. En caso de no ejecutar la instrucción siguiente a un jump, que ya pasó por etapa de fetch deben eliminarse los efectos de la instrucción siguiente, para esto basta que la instrucción que completó su fetch no modifique un registro o escriba en la memoria. Se detecta mediante: if ( PCsel==1)&(Op==j) flush =1; La señal flush implica limpiar el registro IR, para que cuando se decodifique, en el siguiente ciclo, se generen RegWr=0, MemWr=0 con lo cual se propagan acciones nulas. Esto equivale a reemplazar la instrucción leída por un nop, en forma electrónica. 14.5.5. Descarte(flush) en caso de bifurcaciones. En caso de no ejecutar la instrucción siguiente a un beq, que ya pasó por la etapa de fetch deben eliminarse los efectos de la instrucción siguiente, para esto basta que la instrucción que completó su fetch no modifique un registro o escriba en la memoria. Se detecta mediante: if ( PCsel==1)&(Op==beq) flush =1; También puede diseñarse, según: if ( Equal==1)&(Op==beq) flush =1; 14.5.6. Instrucción No operación. Esta instrucción tiene los 32 bits iguales a cero. Es de tipo R, con el campo funct = 0. Se indica a continuación la decodificación de la instrucción nop, en caso de que el compilador los intercale. if (Op == nop) { AluCtr= ; AluSrc= ; ExtOp= ; MemRd = ; MemWr=0; Memtoreg = ; RD= 0; RegWr =0; PCsel =0; válido = 0} además si es nop: rs=0, rt=0, rd =0. 14.6. Camino de datos con solución de riesgos. Las ecuaciones anteriores implican modificaciones a la ruta de datos y el control, las que se ilustran a continuación. Profesor Leopoldo Silva Bijit 13-11-2008 26 Estructuras de Computadores Digitales valido PCsel flush COp funct Decodi ficador rt rd RD RD1 RD2 RegWr RegWr1 RegWr2 MemtoReg MemtoReg1 MemWr MemWr1 MemRd MemRd1 AluCtr IR PC Mem. Inst. AluSrc b j ExtOp inm16 rs rt Inm16a RegWr2 Opera ciones A RD2 PC+4 Mem. Dat. B M D equal inm16 add26 Next PC M S MDout AntB AntA nPC Mout AntM burbuja AluOut reloj Figura 14.29 Camino de datos en procesador segmentado, con soluciones de riesgos. No se muestran las unidades combinacionales que generan las señales: burbuja, AntA, AntB, AntM. El tratamiento de excepciones también requiere efectuar modificaciones al control y a la ruta de datos, que no se discuten en estos apuntes. Profesor Leopoldo Silva Bijit 13-11-2008 Segmentación 27 Índice general. CAPÍTULO 14. ...................................................................................................................................... 1 SEGMENTACIÓN. ............................................................................................................................... 1 14.1 ETAPAS: ....................................................................................................................................... 1 Ejemplo: .......................................................................................................................................... 3 Multiciclo versus segmentación. ...................................................................................................... 4 14.2. ANÁLISIS DE LAS ETAPAS REQUERIDAS POR LAS DIFERENTES INSTRUCCIONES. .............................. 5 14.2.1. Load. ................................................................................................................................... 5 14.2.2. Instrucciones de tipo R. ........................................................................................................ 5 14.2.3. Instrucción sw ...................................................................................................................... 6 14.2.4. Bifurcación. ......................................................................................................................... 7 14.3. PROBLEMAS DE LA SEGMENTACIÓN. RIESGOS DE SEGMENTACIÓN. ................................................ 8 14.3.1. Clasificación de riesgos de datos. ........................................................................................ 8 14.3.2. Tipos de riesgos(hazards) .................................................................................................... 9 Ejemplo de riesgo estructural. .............................................................................................................................. 9 Ejemplo de Riesgo de Control. ........................................................................................................................... 10 14.3.3. Solución de riesgo de control anticipando la comparación. ............................................... 12 14.3.3.1. Detención. ............................................................................................................................................ 12 14.3.3.2. Bifurcaciones retardadas. .................................................................................................................... 12 14.3.3.3. Vaciamiento. (flush) ............................................................................................................................ 12 14.3.3.4. Predicción de las bifurcaciones. .......................................................................................................... 12 14.3.4. Más sobre bifurcaciones retardadas (Delayed Branches). .................................................. 13 14.3.5. Conflicto de datos en operaciones de tipo R o inmediatas. ................................................. 14 14.3.6. Conflicto de datos en transferencias................................................................................... 16 Detención por hardware. ..................................................................................................................................... 17 Solución por software. ........................................................................................................................................ 18 Secuencia lw seguida de sw. ............................................................................................................................... 19 Cargas retardadas. (Delayed Loads) ................................................................................................................... 19 14.4. CAMINO DE DATOS Y CONTROL. ................................................................................................. 20 14.5. SOLUCIÓN DE RIESGOS. .............................................................................................................. 23 14.5.1. Unidad de anticipación de datos hacia la unidad de operaciones. ...................................... 23 14.5.2. Anticipación de escritura en memoria. ............................................................................... 24 14.5.3. Detención de un ciclo en secuencias: lw-alu ...................................................................... 24 14.5.4. Descarte(flush) en caso de saltos incondicionales. ............................................................. 25 14.5.5. Descarte(flush) en caso de bifurcaciones. .......................................................................... 25 14.5.6. Instrucción No operación. .................................................................................................. 25 14.6. CAMINO DE DATOS CON SOLUCIÓN DE RIESGOS. .......................................................................... 25 ÍNDICE GENERAL. ............................................................................................................................... 27 ÍNDICE DE FIGURAS............................................................................................................................. 28 Profesor Leopoldo Silva Bijit 13-11-2008 28 Estructuras de Computadores Digitales Índice de figuras. FIGURA 14.1 FLUJO DE EJECUCIÓN DE INSTRUCCIONES. .............................................................................. 1 FIGURA 14.2 DIFERENTES FLUJOS DE EJECUCIÓN DE INSTRUCCIONES. ......................................................... 2 FIGURA 14.3 CÁLCULO DEL TIEMPO DE EJECUCIÓN EN PROCESADOR SEGMENTADO. ................................... 3 FIGURA 14.4 EJECUCIÓN DE INSTRUCCIONES EN PROCESADOR SEGMENTADO.............................................. 4 FIGURA 14.5 EJECUCIÓN DE INSTRUCCIÓN LOAD. ...................................................................................... 5 FIGURA 14.6 EJECUCIÓN DE INSTRUCCIÓN DE TIPO R, EN CUATRO ETAPAS. ................................................. 5 FIGURA 14.7 EJECUCIÓN DE INSTRUCCIÓN DE TIPO R, CON DETENCIÓN. ...................................................... 6 FIGURA 14.8 EJECUCIÓN DE INSTRUCCIÓN DE TIPO R, CON CICLO DE MEMORIA NULO. ................................ 6 FIGURA 14.9 EJECUCIÓN DE INSTRUCCIÓN STORE WORD. ........................................................................... 7 FIGURA 14.10 EJECUCIÓN DE INSTRUCCIÓN DE BIFURCACIÓN, EN CUATRO ETAPAS. .................................... 7 FIGURA 14.11 EJECUCIÓN DE INSTRUCCIÓN DE BIFURCACIÓN, EN DOS ETAPAS............................................ 7 FIGURA 14.12 EJECUCIÓN DE INSTRUCCIÓN DE SALTO DOS ETAPAS. ........................................................... 8 FIGURA 14.13 TIPOS DE RIESGOS. .............................................................................................................. 8 FIGURA 14.14 EJEMPLO DE RIESGO ESTRUCTURAL. .................................................................................... 9 FIGURA 14.15 EJEMPLO DE RIESGO DE CONTROL. ..................................................................................... 10 FIGURA 14.16 EJEMPLO DE RIESGO DE CONTROL, EN BIFURCACIÓN EN CUATRO ETAPAS. ........................... 10 FIGURA 14.17 INSERCIÓN DE BURBUJAS. .................................................................................................. 11 FIGURA 14.18 RIESGO CON BIFURCACIÓN EN DOS ETAPAS. ....................................................................... 12 FIGURA 14.19 RIESGO EN SECUENCIAS DE TIPO R. .................................................................................... 15 FIGURA 14.20 SOLUCIÓN DE RIESGOS MEDIANTE ANTICIPACIÓN. .............................................................. 15 FIGURA 14.21 RIESGOS EN SECUENCIA DE TRANSFERENCIA. ..................................................................... 16 FIGURA 14.22 DETENCIÓN POR HARDWARE. ............................................................................................ 17 FIGURA 14.23 EJECUCIÓN INDIVIDUAL DE INSTRUCCIONES....................................................................... 18 FIGURA 14.24 SOLUCIÓN POR SOFTWARE. ................................................................................................ 18 FIGURA 14.25 SECUENCIA LW SEGUIDA DE SW. ........................................................................................ 19 FIGURA 14.27 CARGAS RETARDADAS PARA EVITAR DETENCIONES. .......................................................... 19 FIGURA 14.28 CAMINO DE DATOS EN PROCESADOR SEGMENTADO. ........................................................... 21 FIGURA 14.29 CAMINO DE DATOS EN PROCESADOR SEGMENTADO, CON SOLUCIONES DE RIESGOS. ............ 26 Profesor Leopoldo Silva Bijit 13-11-2008