Está en la página 1de 5

12.2.

Riesgos
Introducción

Los riesgos aparecen en situaciones que imposibilitan que en cada ciclo de reloj se inicie la ejecución de una
nueva instrucción. Los riesgos deben ser detectados y resueltos por los diseñadores. Según (Ruz, 2019)
hay tres tipos de riesgos:

Estructurales, cuando dos instrucciones quieren utilizar el mismo recurso en el mismo ciclo.

De datos, se pretende usar un dato sin que se encuentre listo para su utilización. Por ejemplo aún no
se ha terminado de escribir el dato y ya se lo quiere leer para una siguiente instrucción. Es necesario
respetar el orden estricto de lecturas y escrituras

De control, se pretende tomar una decisión sobre una condición todavía no evaluada.

Riesgos estructurales
Para entender los riesgos estructurales, se va a ejemplificar a través de un ejemplo utilizando instrucciones
tipo LOAD. Como se había mencionado la segmentación permite ejecutar varias instrucciones en paralelo ya
que cada etapa tiene un hardware asociado a su ejecución lo que permite trabajar en varias instrucciones de
manera simultánea. Por otra parte, se había indicado que la ejecución de instrucciones en general usan 4
etapas. Sin embargo, las instrucciones tipo LOAD utilizan 5 etapas:

Búsqueda (IF): Lee una instrucción desde la memoria.

Decodificación (ID). Decodifica la instrucción y lee registros.


Ejecuta (EX). Calcula dirección de memoria.

Memoria (MEM). Lee el dato de la memoria.

Escritura (WB). Escribe el dato en el registro.

Figura 6. Ciclo de la instrucción LOAD. (Tirado & Hermida, 2012)

Como se puede observar en la figura 7 la instrucción LOAD requiere de una etapa más para el acceso a
Memoria (MEM) entre las etapas de ejecución(EX) y escritura(WB). Para el ejemplo mostrado cada etapa
requiere de un solo ciclo de reloj. Si se utiliza un procesador segmentado de cinco etapas, que opere un
programa de sólo instrucciones load, la ejecución en el tiempo sería la que se muestra en la figura 8.

Para
Figura 7. Ejecución de un programa con instrucciones LOAD en un procesador segmentado de 5 etapas (Tirado & Hermida, 2012)

La figura 8 muestra la ejecución de dos instrucciones en un procesador segmentado de 5 etapas, en el que


se observa que si las dos instrucciones son tipo load no existe conflicto de uso de componentes (Ejemplo 1),
mientras que en el Ejemplo2 aparece un conflicto ya que la instrucción ADD usa cuatro etapas y durante el
ciclo 5 dos instrucciones requieren la misma etapa(WB). Debido a que no es posible que dos instrucciones
accedan al mismo tiempo a una etapa(componente hardware) para solucionar el problema todas las
instrucciones deben pasar por todas las etapas aún cuando no lo requieran.

Figura 8. Ejecución de programas en procesadores segmentados. (Ruz, 2019)

Para evaluar los riesgos estructurales se debe garantizar la ejecución de cualquier combinación de
instrucciones sin conflicto. La figura 9 sintetiza las etapas en donde se utiliza la memoria, los registros y la
ALU. Por ejemplo la ALU se requiere tanto para la etapa de ejecución como de búsqueda, e incluso en la
etapa de ejecución puede realizar varios tipos de cálculos por lo tanto para evitar riesgos en la segmentación
se debe añadir una ALU en la etapa de búsqueda y una segunda ALU en la ejecución. La figura 10 muestra
en rojo los recursos que fueron añadidos en la ruta de datos para evitar conflictos y lograr realizar
segmentación.
Figura 9. Combinación de instrucciones y uso de recursos por cada etapa.

Figura 10. Ruta de datos con duplicación de recursos. (Ruz, 2019)

Riesgos de datos
Los riesgos de datos se producen cuando por la segmentación se utilizan como datos válidos para una
operación, datos que aún no han sido actualizados y de esta manera no se respeta la lógica del programa.
Este tipo de riesgo se produce cuando dos instrucciones cuyos datos son dependientes entre sí se ejecutan
simultáneamente. Es decir debido a la segmentación, se modifica el resultado esperado por el programa.
Existen tres tipos diferentes de riesgos:

Lectura después de escritura (LDE)


Escritura después de lectura (EDL)
Escritura después de escritura (EDE )

Tabla 1
Ejemplos de riesgos de datos

Ejemplo Seudo- Acción Riesgo


código

r2 sea leído para ejecutar la


Add r2, r3, r4 r2= r3+r4 escribe el registro r2 instrucción 2 antes que la
Add r5, r1, r2 r5= r1+r2 lee el registro r2 instrucción 1 escriba el
resultado en r2(LDE)

Add r4, r5, r3 r4= r5+r3 lee el registro r5 r5 sea escrito por la
instrucción 2 antes que la
Add r5, r1, r2 r5= r1+r2 escribe el registro r5 instrucción 1 lea r5(EDL)

r3 sea escrito por la


Add r3, r1, r2 r3= r1+r2 escribe el registro r3 instrucción 2 antes que la
Add r3, r4, r5 r3= r4+r5 lee el registro r3 instrucción 1 escriba el
resultado en r3(EDE)

La tabla 1 resume los tipos de riesgos de datos causados por segmentación. Los riesgos EDL y EDE pueden
ser superados mediante una segmentación lineal en la que los registros se leen durante final de la segunda
etapa (Decodificación ID), las instrucciones escriben en la última etapa (WB) y todas las instrucciones tienen
igual duración. En tanto que los riesgos LDE pueden superarse: a) deteniendo la segmentación hasta que se
haya escrito el registro dependiente, b) reordenar el código, c) forwardind (cortocircuito), que envía el dato
hacia las etapas que requieren una vez que lo tiene listo sin esperar llegar a la última etapa de escritura, y, d)
una mezcla de las opciones dependiendo de la arquitectura y del caso de instrucción analizada.

Riesgos de control

Se refieren a los riesgos relacionados con las operaciones de control del programa como son los saltos
condicionales. Para realizar un salto condicional se requiere haber calculado la dirección a la que se va a
saltar y haber verificado la condición de salto. El riesgo se produce dado que ambas situaciones se calculan
en la etapa de ejecución. Si la condición es verdadera la nueva dirección del contador del programa se
carga en la etapa MEM.

Figura 11. Ejemplo de un programa con riesgo de control (Ruz, 2019)

La figura 11 muestra una porción de código y su diagrama de flujo para un salto condicional. En este caso se
puede ver que la condición de salto(en color rojo) es dependiente del resultado de la ejecución de la
instrucción anterior. Por tanto si la instrucción anterior aún no ha guardado los datos en r1, cuando se evalúa
la condición de salto de r1 es igual a r2 da conflictos. La solución a este riesgo es esperar algunos ciclos
antes de evaluarla condición de salto, por ejemplo a través de la inserción de instrucciones nop en el pipeline
del sistema (en la ruta de datos segmentada). Otra solución es mover el cálculo de la dirección y la
evaluación de la condición a la etapa de decodificación.
Un ejemplo de una ruta de datos completa y resolviendo los tres tipos de datos analizados (estructurales, de
datos, y de control) se muestra en la figura 12. Para este caso se asume que los riesgos de control fueron
resueltos mediante la ayuda del compilador quién añadió instrucciones NOP al pipeline del programa.

Figura 12. Ruta de datos segmentada considerando la resolución de los riesgos. (Ruz, 2019)

Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir igual 4.0

Unidad de Educación a

También podría gustarte