Академический Документы
Профессиональный Документы
Культура Документы
Pero aun así hay conflictos cuando existen accesos simultáneos de datos
por parte de varios segmentos. Para esto se agregan nuevos puertos a la
cache de datos o también limitando los accesos a datos a determinadas
instrucciones para que sea difícil que se superponga(arquitecturas
registro-registro o carga-almacenamiento).
El problema todavía se agrava más en los cauces multifunción
dinámicamente configurables. En estos casos ocurren las colisiones que
son usos simultáneos de varios segmentos por parte de ejecuciones
distintas de una misma función o por varias funciones. Para este
problema se lleva a cabo las llamadas tablas de reservas, las cuales
contienen información sobre la ocupación de cada segmento en cada uno
de los ciclos máquina. Las filas representan a los segmentos y las
columnas a los ciclos necesarios para la ejecución de la tarea.
¿Qué hay que hacer para resolver esto? Pues la respuesta es algo simple
en realidad, lo que se tiene que hacer es superponer la misma tabla, pero
desplazada un espacio a la derecha y si hay un espacio de segmento que
esta siendo ocupada por la tabla original y desplazada es imposible que
se ejecute por segunda vez esa instrucción en el siguiente ciclo del
procesador. Se seguirá desplazando hasta que las dos tablas no ocupen
un mismo segmento.
i1. R2 <- R1 + R3
i2. R4 <- R2 + R3
i1. r1 <- r2 + r3
i2. r3 <- r4 x r5
3. Conflictos de control:
Estas se deben a las instrucciones de control de flujo, en que no se puede
leer la instrucción siguiente hasta que se conozca su dirección.
¿Pero por qué ocurre este problema?
_ El cálculo de la dirección de destino se efectúa en la fase de escritura
de resultado y esta fase suele ser en la mayoría de casos la última. Por lo
que una instrucción de control de flujo provocara una detención del
procesador.
Otros conflictos de este tipo que podríamos mencionar, aunque un poco
más difíciles de controlar, serían las interrupciones, dado que estos casos
no están previstos dentro de la ejecución de un programa.
Podemos mejorar este tiempo si dejamos que se continúen leyendo
instrucciones. De esta manera si la condición de salto no se da ya se
habrá avanzado algo.
Una de las soluciones para evitar esta perdida de rendimiento es hacer
que el compilador encuentre algo que hacer mientras se calcula la
dirección de destino de salto. Si el compilador no pudiera encontrar
ninguna instrucción para ocupar los huecos libres dejados por las
instrucciones de salto, rellenaría con instrucciones NOP.