En la arquitectura informática , una arquitectura activada por transporte ( TTA ) es un tipo de diseño de procesador en el que los programas controlan directamente los buses de transporte internos de un procesador. La computación ocurre como un efecto secundario del transporte de datos: escribir datos en un puerto de activación de una unidad funcional activa la unidad funcional para iniciar un cálculo. Esto es similar a lo que sucede en una matriz sistólica . Debido a su estructura modular, TTA es una plantilla de procesador ideal para procesadores de conjuntos de instrucciones específicos de la aplicación ( ASIP) con una ruta de datos personalizada pero sin la inflexibilidad y el costo de diseño de los aceleradores de hardware de función fija.
Normalmente, un procesador activado por transporte tiene múltiples buses de transporte y múltiples unidades funcionales conectadas a los buses, lo que brinda oportunidades para el paralelismo a nivel de instrucción . El paralelismo lo define estáticamente el programador. A este respecto (y obviamente debido al gran ancho de palabra de instrucción), la arquitectura TTA se parece a la arquitectura de palabra de instrucción muy larga (VLIW). Una palabra de instrucción TTA se compone de múltiples ranuras, una ranura por bus, y cada ranura determina el transporte de datos que tiene lugar en el bus correspondiente. El control de grano fino permite algunas optimizaciones que no son posibles en un procesador convencional. Por ejemplo, el software puede transferir datos directamente entre unidades funcionales sin utilizar registros.
La activación por transporte expone algunos detalles de la microarquitectura que normalmente están ocultos a los programadores. Esto simplifica enormemente la lógica de control de un procesador, porque muchas decisiones que normalmente se toman en tiempo de ejecución se fijan en tiempo de compilación . Sin embargo, también significa que un binario compilado para un procesador TTA no se ejecutará en otro sin recompilación si existe una pequeña diferencia en la arquitectura entre los dos. El problema de incompatibilidad binaria, además de la complejidad de implementar un cambio de contexto completo, hace que los TTA sean más adecuados para los sistemas integrados que para la computación de propósito general.
De todas las arquitecturas de computadora de un conjunto de instrucciones , la arquitectura TTA es una de las pocas que ha construido procesadores basados en ella, y la única que tiene procesadores basados en ella vendidos comercialmente.
Beneficios en comparación con las arquitecturas VLIW
Los TTA pueden verse como arquitecturas VLIW de "ruta de datos expuesta". Mientras que VLIW se programa mediante operaciones, TTA divide la ejecución de la operación en múltiples operaciones de movimiento . El modelo de programación de bajo nivel ofrece varios beneficios en comparación con el VLIW estándar. Por ejemplo, una arquitectura TTA puede proporcionar más paralelismo con archivos de registro más simples que con VLIW. Como el programador tiene el control de la sincronización del operando y los transportes de datos de resultado, la complejidad (el número de puertos de entrada y salida) del archivo de registro (RF) no necesita escalarse de acuerdo con el peor escenario de emisión / finalización del caso. múltiples instrucciones paralelas.
Una importante optimización de software única habilitada por la programación de transporte se denomina omisión de software . En caso de que se omita el software, el programador omite la escritura del archivo de registro moviendo los datos directamente a los puertos de operando de la siguiente unidad funcional. Cuando esta optimización se aplica agresivamente, el movimiento original que transporta el resultado al archivo de registro se puede eliminar por completo, reduciendo así la presión del puerto del archivo de registro y liberando un registro de propósito general para otras variables temporales. La presión de registro reducida , además de simplificar la complejidad requerida del hardware de RF, puede generar importantes ahorros de energía de la CPU , un beneficio importante especialmente en los sistemas integrados móviles. [1] [2]
Estructura
Los procesadores TTA están construidos con unidades de función independientes y archivos de registro , que están conectados con buses de transporte y sockets .
Unidad de función
Cada unidad de función implementa una o más operaciones , que implementan funcionalidades que van desde una simple suma de números enteros hasta un cálculo específico de la aplicación definido por el usuario complejo y arbitrario. Los operandos para las operaciones se transfieren a través de los puertos de la unidad de función .
Cada unidad de función puede tener una canalización independiente . En caso de que una unidad de función esté completamente canalizada , se puede iniciar una nueva operación que requiere varios ciclos de reloj para finalizar en cada ciclo de reloj. Por otro lado, una canalización puede ser tal que no siempre acepte nuevas solicitudes de inicio de operación mientras una antigua aún se está ejecutando.
El acceso a la memoria de datos y la comunicación con el exterior del procesador se maneja mediante unidades de funciones especiales. Las unidades de función que implementan operaciones de acceso a la memoria y se conectan a un módulo de memoria a menudo se denominan unidades de carga / almacenamiento .
Unidad de control
La unidad de control es un caso especial de unidades de función que controla la ejecución de programas. La unidad de control tiene acceso a la memoria de instrucciones para obtener las instrucciones a ejecutar. Para permitir que los programas ejecutados transfieran la ejecución (salto) a una posición arbitraria en el programa ejecutado, la unidad de control proporciona operaciones de flujo de control. Una unidad de control generalmente tiene una canalización de instrucciones , que consta de etapas para buscar, decodificar y ejecutar instrucciones del programa.
Registrar archivos
Los archivos de registro contienen registros de propósito general , que se utilizan para almacenar variables en programas. Al igual que las unidades de función, los archivos de registro también tienen puertos de entrada y salida. El número de puertos de lectura y escritura, es decir, la capacidad de poder leer y escribir varios registros en un mismo ciclo de reloj, puede variar en cada archivo de registro.
Transporte autobuses y enchufes
La arquitectura de interconexión consta de buses de transporte que están conectados a los puertos de la unidad de función por medio de enchufes . Debido al gasto de conectividad, es habitual reducir el número de conexiones entre unidades (unidades de función y archivos de registro). Se dice que un TTA está completamente conectado en caso de que haya una ruta desde el puerto de salida de cada unidad hasta los puertos de entrada de cada unidad.
Los sockets proporcionan un medio para programar procesadores TTA al permitir seleccionar qué conexiones de bus a puerto del socket están habilitadas en cualquier momento. Por lo tanto, los transportes de datos que tienen lugar en un ciclo de reloj se pueden programar definiendo la conexión de puerto / toma de origen y destino que se habilitará para cada bus.
Ejecución condicional
Algunas implementaciones de TTA admiten la ejecución condicional .
La ejecución condicional se implementa con la ayuda de guardias . Cada transporte de datos puede estar condicionado por un protector, que está conectado a un registro (a menudo un registro condicional de 1 bit ) y a un bus. En caso de que el valor del registro protegido se evalúe como falso (cero), el transporte de datos programado para el bus al que está conectado el protector se aplasta , es decir, no se escribe en su destino. Los transportes de datos incondicionales no están conectados a ningún resguardo y siempre se ejecutan.
Sucursales
Todos los procesadores, incluidos los procesadores TTA, incluyen instrucciones de flujo de control que alteran el contador del programa, que se utilizan para implementar subrutinas , if-then-else , for-loop , etc. El lenguaje ensamblador de los procesadores TTA normalmente incluye instrucciones de flujo de control como incondicional ramas (JUMP), ramas relativas condicionales (BNZ), llamada de subrutina (CALL), retorno condicional (RETNZ), etc. que tienen el mismo aspecto que las instrucciones en lenguaje ensamblador correspondientes para otros procesadores.
Como todas las demás operaciones en una máquina TTA, estas instrucciones se implementan como instrucciones de "mover" a una unidad de función especial.
Las implementaciones de TTA que admiten la ejecución condicional, como sTTAck y el primer prototipo MOVE, pueden implementar la mayoría de estas instrucciones de flujo de control como un movimiento condicional al contador del programa. [3] [4]
Las implementaciones de TTA que solo admiten el transporte de datos incondicionales, como el MAXQ, suelen tener una unidad de función especial estrechamente conectada al contador del programa que responde a una variedad de direcciones de destino. Cada una de estas direcciones, cuando se utiliza como destino de un "movimiento", tiene un efecto diferente en el contador del programa: cada instrucción de "rama relativa
Programación
En arquitecturas de procesador más tradicionales, un procesador generalmente se programa definiendo las operaciones ejecutadas y sus operandos. Por ejemplo, una instrucción de suma en una arquitectura RISC podría tener el siguiente aspecto.
agregar r3, r1, r2
Esta operación de ejemplo suma los valores de los registros de propósito general r1 y r2 y almacena el resultado en el registro r3. En términos generales, la ejecución de la instrucción en el procesador probablemente resulte en traducir la instrucción a señales de control que controlan las conexiones de la red de interconexión y las unidades de función. La red de interconexión se utiliza para transferir los valores actuales de los registros r1 y r2 a la unidad de función que es capaz de ejecutar la operación de suma, a menudo llamada ALU como en Unidad Aritmético-Lógica. Finalmente, una señal de control selecciona y activa la operación de suma en ALU, cuyo resultado se transfiere de nuevo al registro r3.
Los programas TTA no definen las operaciones, solo los transportes de datos necesarios para escribir y leer los valores del operando. La operación en sí se activa escribiendo datos en un operando de activación de una operación. Por tanto, una operación se ejecuta como un efecto secundario del transporte de datos de activación. Por lo tanto, ejecutar una operación de suma en TTA requiere tres definiciones de transporte de datos, también llamadas movimientos . Un movimiento define los puntos finales para un transporte de datos que tiene lugar en un bus de transporte. Por ejemplo, un movimiento puede indicar que un transporte de datos desde la unidad de función F, puerto 1, al archivo de registro R, índice de registro 2, debe tener lugar en el bus B1. En caso de que haya varios buses en el procesador de destino, cada bus se puede utilizar en paralelo en el mismo ciclo de reloj. Por lo tanto, es posible explotar el paralelismo a nivel de transporte de datos programando varios transportes de datos en la misma instrucción.
Se puede ejecutar una operación de adición en un procesador TTA de la siguiente manera:
r1 -> ALU.operand1r2 -> ALU.add.triggerResultado ALU -> r3
El segundo movimiento, una escritura en el segundo operando de la unidad de función llamada ALU, desencadena la operación de suma. Esto hace que el resultado de la adición esté disponible en el puerto de salida 'resultado' después de la latencia de ejecución de la 'adición'.
Los puertos asociados con la ALU pueden actuar como un acumulador , lo que permite la creación de macroinstrucciones que abstraen el TTA subyacente:
lda r1 ; "cargar ALU": mover valor al operando 1 de ALU agregar r2 ; agregar: mover valor para agregar disparador sta r3 ; "almacenar ALU": mover valor del resultado de ALU
Latencia de operación visible del programador
La filosofía principal de los TTA es trasladar la complejidad del hardware al software. Debido a esto, se introducen varios peligros adicionales para el programador. Uno de ellos son las ranuras de retardo , la latencia de funcionamiento visible del programador de las unidades de función. El tiempo es completamente responsabilidad del programador. El programador tiene que programar las instrucciones de modo que el resultado no se lea ni demasiado pronto ni demasiado tarde. No hay detección de hardware para bloquear el procesador en caso de que un resultado se lea demasiado pronto. Considere, por ejemplo, una arquitectura que tiene una operación agregar con latencia de 1 y la operación mul con latencia de 3. Al disparar la operación de agregar , es posible leer el resultado en la siguiente instrucción (siguiente ciclo de reloj), pero en En el caso de mul , hay que esperar dos instrucciones antes de poder leer el resultado. El resultado está listo para la tercera instrucción después de la instrucción de activación.
La lectura de un resultado demasiado pronto da como resultado la lectura del resultado de una operación activada anteriormente, o en caso de que no se haya activado ninguna operación previamente en la unidad de función, el valor leído no está definido. Por otro lado, el resultado debe leerse lo suficientemente temprano para asegurarse de que el resultado de la siguiente operación no sobrescriba el resultado aún no leído en el puerto de salida.
Debido a la abundancia de contexto de procesador visible al programador que prácticamente incluye, además del contenido del archivo de registro, también el contenido del registro de canalización de la unidad de función y / o los puertos de entrada y salida de la unidad de función, los guardados de contexto necesarios para el soporte de interrupciones externas pueden volverse complejos y costosos para implementar en un procesador TTA. Por lo tanto, los procesadores TTA no suelen admitir las interrupciones, pero su tarea se delega a un hardware externo (por ejemplo, un procesador de E / S) o se evita su necesidad mediante el uso de un mecanismo alternativo de sincronización / comunicación como el sondeo.
Implementaciones
- MAXQ [5] [6] de Dallas Semiconductor , el único microcontrolador disponible comercialmente construido sobre arquitectura activada por transporte, es un OISC o " una computadora con un conjunto de instrucciones ". Ofrece una única instrucción MOVE, aunque flexible, que luego puede funcionar como varias instrucciones virtuales moviendo valores directamente al contador del programa .
- El "proyecto de movimiento" ha diseñado y fabricado varios microprocesadores TTA experimentales.
- OpenASIP es un conjunto de herramientas de conjunto de instrucciones de aplicación específica de código abierto que utiliza TTA como plantilla de procesador.
- La arquitectura del Amiga Copper tiene todas las características básicas de una arquitectura activada por transporte.
- El procesador Able desarrollado por New England Digital .
- La computadora basada en WireWorld .
- El Dr. Dobb publicó One-Der, un TTA de 32 bits en Verilog con un ensamblador cruzado coincidente y un compilador Forth. [7] [8]
- El procesador de vértices Mali (200/400) utiliza un TTA escalar de coma flotante de precisión simple de palabra de instrucción de 128 bits [ cita requerida ] .
Ver también
- Procesador de conjunto de instrucciones específico de la aplicación (ASIP)
- Palabra de instrucción muy larga (VLIW)
- Computación de instrucción explícitamente paralela (EPIC)
- Arquitectura de flujo de datos
Referencias
- ^ V. Guzma, P. Jääskeläinen, P. Kellomäki y J. Takala, "Impacto de la omisión de software en el paralelismo de nivel de instrucción y el tráfico de archivos de registro"
- ^ Johan Janssen. "Estrategias del compilador para arquitecturas activadas por transporte" . 2001. p. 168.
- ^ Henk Corporaal. "Arquitecturas activadas por transporte examinadas para aplicaciones de propósito general" . pag. 6.
- ^ Aliaksei V. Chapyzhenka. "STAck: Arquitectura activada por transporte de pila" .
- ^ "Guía del usuario de la familia MAXQ" . La sección "1.1 Conjunto de instrucciones" dice "Una arquitectura activada por transporte basada en registros permite que todas las instrucciones se codifiquen como operaciones de transferencia simples. Todas las instrucciones se reducen a escribir un valor inmediato en un registro de destino o ubicación de memoria o mover datos entre registros y / o ubicaciones de memoria ".
- ^ Introducción a la arquitectura MAXQ : incluye diagrama de mapa de transferencia
- ^ Artículo del Dr. Dobb con CPU FPGA de 32 bits en Verilog
- ^ Sitio web con más detalles sobre la CPU del Dr. Dobb Archivado el 18 de febrero de 2013 en archive.today
enlaces externos
- Proyecto MOVE: Síntesis automática de procesadores específicos de aplicaciones (accesible a través de la máquina wayback)
- Ventajas de las arquitecturas activadas por transporte
- Arquitecturas de microprocesador de VLIW a TTA
- Artículo de descripción general de BYTE