Arquitectura Pipeline del TMS320C3X y Gestión de Conflictos
Efectos de las Interrupciones
En los procesadores de T.I. (C5x), un ciclo después de que se reconozca la interrupción, el procesador inserta una instrucción especial llamada INTR
en la estructura pipeline. INTR
es una instrucción especial de salto que provoca el comienzo de la ejecución en el apropiado vector de interrupción. INTR
se comporta igual que un salto multiciclo y causa un retraso de 4 ciclos en la respuesta a la interrupción. Este último caso de interrupciones con menos de 3 instrucciones en el servicio las denomina Motorola como “interrupciones rápidas”.
7. Modelos de Programación de la Pipeline
a) Modelo de Programación “Tiempo Estacionario”
Las instrucciones del procesador especifican la acción que tienen que realizar las unidades de ejecución en un instante determinado. Este modelo también se denomina “modelo de programación sin datos relacionados”.
b) Modelo de Programación “Datos Estacionarios”
Las instrucciones del procesador especifican cómo se tienen que obtener los datos para poder realizar la operación deseada. “Modelo de programación con datos relacionados”.
El modelo de programación de datos estacionarios es más sencillo de programar, pero es menos eficiente y menos flexible que el modelo de tiempo estacionario.
8. Estructura Pipeline del TMS320C3X
Existen 5 Unidades funcionales que controlan las operaciones en el C3X:
- Búsqueda
- Decodificación
- Lectura
- Ejecución
- Accesos directos a memoria (DMA)
— Las 4 primeras forman una estructura pipeline (procesamiento en paralelo en serie o cadena).
El controlador DMA reduce las operaciones de Entrada y Salida realizadas por el procesador, aumentando el rendimiento de éste. Las operaciones de DMA se realizan en paralelo con la estructura pipeline.
Las funciones de las 4 unidades que forman la estructura pipeline son:
- Búsqueda (F): Realiza la búsqueda de la palabra de instrucción y actualiza el PC.
- Decodificación (D): Realiza la decodificación de la instrucción y se encarga de la generación de las direcciones. También modifica los registros auxiliares (ARx) y el puntero de pila.
- Lectura (R): Lee los operandos de memoria.
- Ejecución (E): Lee los operandos de la matriz de registros. Realiza las operaciones necesarias (multiplicador/ALU) y escribe el resultado en la matriz de registros. También se utiliza para almacenar datos en la memoria en las instrucciones de almacenamiento (por ejemplo
STI
).
En la siguiente figura se puede ver un solapamiento perfecto en la estructura pipeline. El control de la estructura pipeline maneja los conflictos para que sea casi transparente para el usuario. No es necesario tener un cuidado especial para garantizar las operaciones.
Las prioridades de las Unidades funcionales son de mayor a menor:
- Ejecución.
- Lectura.
- Decodificación.
- Búsqueda.
- DMA.
8.2 Conflictos en la Estructura Pipeline
Los conflictos de la estructura pipeline del C3X los vamos a agrupar en:
a) Conflictos Debidos a los Saltos
Este conflicto se produce con las bifurcaciones estándar como: BR
, Bcond
, DBcond
, CALL
, IDLE
, RPTB
, RPTS
, RETIcond
, RETScond
, interrupciones y reset. Cuando el procesador detecta una de éstas instrucciones, anula la entrada de nuevas instrucciones y limpia la estructura pipeline. Los conflictos de las instrucciones TRAPcond
y CALLcond
son diferentes y se tratarán más tarde. En el ejemplo se llega a buscar la instrucción MPYF
modificando la caché, aunque nunca se llega a ejecutar. Estas instrucciones de bifurcación también se denominan “bifurcaciones multiciclo” ya que tardan 4 ciclos en ejecutarse.
Las instrucciones de repetición RPTS
y RPTB
también limpian la estructura pipeline para poder almacenar correctamente los valores de los registros RS
, RE
y RC
.
Las instrucciones de salto retardado: BRD
, BcondD
y DBcondD
no vacían la estructura pipeline. Como no hay vaciamiento, las tres instrucciones siguientes a la de bifurcación se ejecutarán como vemos en la figura.
b) Conflictos con los Registros
Se producen cuando se intenta acceder a un registro y éste no está preparado. Los registros que pueden dar conflicto son los registros de direcciones (ARx, IRx, BK, DP y SP) ya que se utilizan en la fase de lectura y además en la fase de ejecución. Los registros están agrupados en tres grupos funcionales:
- Grupo 1. Este grupo incluye todos los registros que son fuente de las ARAU’s (Unidades generadoras de direcciones): AR0-AR7, IR0-1, y BK.
- Grupo 2. Puntero de página DP.
- Grupo 3. Puntero de pila SP.
Cuando una instrucción tiene que escribir en un registro, la unidad de decodificación no podrá usar ningún registro de ese grupo hasta que finalice la carga.
Por lo tanto los conflictos se producen entre miembros de un mismo grupo. Como se producen varias búsquedas de código, éstas pueden producir otros conflictos, por ejemplo con el DMA. También actúa la caché en todas éstas búsquedas. También si una instrucción necesita leer un registro de un grupo determinado para poder realizar una operación en la fase de ejecución, el uso de cualquier registro del grupo en la fase de decodificación se retrasa hasta que finaliza la lectura. En las instrucciones que utilizan los ARx como contadores (DBcond
) se considera que son instrucciones que modifican ARx y no utilizan ARx. Por lo tanto también pueden provocar estos conflictos.
c) Conflictos con la Memoria
Se producen cuando se excede el ancho de banda del espacio físico direccionable. Por ejemplo las RAM’s y la ROM internas soportan solo dos accesos por ciclo. Si se supera éste límite se produce un conflicto con la memoria.
Vamos a dividir éste conflicto en 4 grupos:
c1) Programa en Espera
Este conflicto se produce cuando no se puede realizar una búsqueda de una instrucción, ya que produciría un conflicto con la memoria. Se pueden producir por dos causas:
- Se excede el ancho de banda de las memorias internas (2 accesos).
- Se excede el ancho de banda de uno de los interfaces externos (1 acceso).
c2) Búsqueda Incompleta de una Instrucción
Este conflicto se produce cuando la búsqueda de una instrucción necesita más de un ciclo, por ejemplo porque tenemos estados de espera.
c3) Solo Ejecución
Este conflicto se produce cuando es necesario realizar tres accesos a memoria en un ciclo o con las cargas “interlocked” (interbloqueo). Existen tres casos posibles:
- Una instrucción de escritura se encuentra delante de una instrucción que necesita leer dos datos de memoria.
c4) Retención Total
Este conflicto produce un paro de toda la estructura pipeline. Hay tres tipos de conflictos:
- No se pueden cargar datos porque un interface externo está ocupado.
- Una carga externa necesita varios ciclos (lectura multiciclo).
- Se ejecuta una
Trapcond
oCallcond
. Son las dos únicas instrucciones que tienen un almacenamiento condicional. Necesitan un ciclo para verificar la condición y otro/s para realizar el almacenamiento.
8.3 Solución a los Conflictos
Veamos cómo se pueden solucionar los diferentes tipos de conflictos para aumentar el rendimiento del procesador:
a) Solución a los Conflictos con los Registros
La utilización de los registros de direcciones (ARx, IR0-1, BK, DP y SP) para funciones que no sean de direccionamiento crearán conflictos. La utilización continuada de éstos registros como punteros nunca producen conflictos. Tampoco produce conflicto una actualización de un puntero seguida de una utilización del puntero, cuando entre ambas hay al menos dos instrucciones. El direccionamiento absoluto (@dir
) utiliza de forma indirecta el registro DP y las instrucciones de llamada a subrutina, retorno, etc. utilizan SP.