Dependencias de datos

Las dependencias de datos se dan en los procesadores al transformar el código cualunque de un programador ( como yo ) en código máquina. Tarea de la que se encarga el compilador. Las dependencias se dan por diversar razones pero básicamente es que se modifique el valor de un registro, antes de ser usado por la siguiente instrucción como estaba planificado.

Tipos principales

Hay tres tipos principales de dependencias:

  • RAW – Read After Write
  • WAR – Write After Read
  • WAW – Write After Write

RAW – Read After Write: dependencia verdadera

Una dependencia RAW hace referencia a una situación donde se necesita un dato que aún no ha sido calculado, por ejemplo:

i1. R2 <- R1 + R3
i2. R4 <- R2 + R3

La primera instrucción calcula un valor que será guardado en el registro R2, mientras que la segunda necesita este valor para computarlo y almacenar el resultado en el registro R4. Sin embargo, en un procesador segmentado, cuando se capturan los operandos para realizar la segunda instrucción, los resultados de la primera aún no han sido guardados, de forma que aparece una dependencia de datos. Recordemos que en los procesadores segementados las instrucciones se dividen en etapas y en cada etapa hay una parte diferente de cada instrucción. Es decir en el siguiente procesador podriamos ejecutar 5 instrucciones casi paralelas. Cada etapa es un ciclo de reloj.

Bloque instrucción procesador segmentado

Bloque instrucción procesador segmentado

En el gráfico anterior podemos ver como si no hay ningun tipo de control para evitar la raw, la instrucción 2 se ejecutaria antes de que la 1 guarde el resultado ya que esta lo guarda en la etapa mem. Hay formas de evitarlo y la mas sencilla e ineficaz de todas es meter un NOP, es decir un codigo de no operación que consiste en que el procesador no ejecute la instruccion 2 hasta que la instrucción 1 haya guardado en su etapa mem. Decimos que es la mas ineficaz por la perdida de ciclos ya que el procesador hay momentos en los que no esta ejecutando nada.

Para que entiendas la perdida de rendimiento: si todo fué bien y ejecutó las dos instrucción tardó en hacerlo 6 ciclos (1 ciclo por etapa). Si hay una dependencia raw y mete no operación la instrucción dos la va a buscar a memoria (etapa if) cuando acaba la mem de la isntrucción 1 , esto es en el ciclo 4 con lo que tardaria 9 ciclos en ejecutarse las 2 instrucciónes. Pede paracer que de 6 a 9 ciclos parece poco pero pensa que son millones de estas por ciclo y que pasaria si hay una raw en cada instrucción?

Otras formas de evitar las dependecias RAW un poco mas eficientes son:

  • La reorganización de código
  • El interbloqueo entre etapas
  • El adelantamiento

WAR – Write After Read: antidependencia

Una dependencia WAR representa un problema de ejecución concurrente, por ejemplo:

i1. r1 <- r2 + r3
i2. r3 <- r4 x r5

Si por alguna razón la instrucción 2 puede finalizar antes de que lo haga la 1 (por ejemplo, en ejecución concurrente), es necesario asegurarse de que no se almacenará el resultado en el registro R3 antes de que la instrucción 1 haya podido leer sus operandos.

WAW – Write After Write: dependencia de salida

Una dependencia WAW es otra de las posibles situaciones problemáticas en un entorno de ejecución concurrente, por ejemplo:

i1. r2 <- r1 + r3
i2. r2 <- r4 x r7

En este caso debe retrasarse la escritura (etapa WB) de la instrucción 2 hasta que la instrucción 1 haya finalizado.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s