Dependencia de datos
En informática, se conoce como dependencia de datos aquella situación en que las instrucciones de un programa se refieren a los resultados de otras anteriores que aún no han sido completadas. Si dichas dependencias no son resueltas provocarán riesgos de datos o incluso condiciones de carrera. El área de estudio de las dependencias de datos se conoce como análisis de dependencias.
Tipos principales
[editar]Hay tres tipos principales de dependencias:
- RAW - Read After Write
- WAR - Write After Read
- WAW - Write After Write
RAW - Read After Write
[editar]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.
Se dice que existe una dependencia de datos en la instrucción 2, la cual depende de la finalización de la instrucción 1.
WAR - Write After Read
[editar]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
[editar]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.
Soluciones
[editar]Puede ser posible delegar la tarea de la eliminación de dependencias de datos en el compilador, que rellenará el código con las instrucciones NOP necesarias para asegurar la corrección del resultado del programa, o bien reordenará las instrucciones en aquellos fragmentos de código donde sea posible.
Otros métodos, implementados de forma física en los chips son: