Articulo de referencia

Arquitectura activada por transporte

En arquitectura de computadoras , una arquitectura activada por transporte ( TTA ) es un tipo de diseño de procesador en el que los programas controlan directamente los buses de...

En arquitectura de computadoras , 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 del procesador. La computación se produce como un efecto secundario del transporte de datos: al escribir datos en un puerto de activación de una unidad funcional , esta inicia la computación. Esto es similar a lo que ocurre en una matriz sistólica . Gracias a su estructura modular, TTA es una plantilla de procesador ideal para procesadores con conjuntos de instrucciones específicos para aplicaciones ( ASIP ) con una ruta de datos personalizada, pero sin la inflexibilidad ni el coste de diseño de los aceleradores de hardware de función fija.

Normalmente, un procesador activado por transporte (TTA) cuenta con múltiples buses de transporte y múltiples unidades funcionales conectadas a estos buses, lo que ofrece oportunidades para el paralelismo a nivel de instrucción . El paralelismo lo define estáticamente el programador. En este sentido (y obviamente debido al gran ancho de palabra de instrucción), la arquitectura TTA se asemeja 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 se realiza en el bus correspondiente. El control granular 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.

El mecanismo de activación de transporte expone algunos detalles microarquitectónicos que normalmente permanecen ocultos para los programadores. Esto simplifica enormemente la lógica de control de un procesador, ya que muchas decisiones que normalmente se toman en tiempo de ejecución se fijan en tiempo de compilación . Sin embargo, también implica que un binario compilado para un procesador TTA no se ejecutará en otro sin recompilación si existe incluso una pequeña diferencia en la arquitectura entre ambos. El problema de la incompatibilidad binaria, sumado a la complejidad de implementar un cambio de contexto completo, hace que los TTA sean más adecuados para sistemas embebidos que para computación de propósito general.

De todas las arquitecturas informáticas con un único conjunto de instrucciones , la arquitectura TTA es una de las pocas que ha tenido procesadores basados ​​en ella, y la única que tiene procesadores basados ​​en ella que se venden comercialmente.

Ventajas en comparación con las arquitecturas VLIW

Las arquitecturas TTA pueden considerarse arquitecturas VLIW con "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 varias ventajas en comparación con VLIW estándar. Por ejemplo, una arquitectura TTA puede proporcionar mayor paralelismo con registros más sencillos que VLIW. Dado que el programador controla la temporización del transporte de datos de operando y resultado, la complejidad (el número de puertos de entrada y salida) del registro no necesita ajustarse al peor escenario de ejecución de las instrucciones paralelas.

Una importante optimización de software, posibilitada por la programación de transporte, se denomina derivación de software . En este caso, el programador omite la escritura en el archivo de registros moviendo los datos directamente a los puertos de operando de la siguiente unidad funcional. Cuando esta optimización se aplica de forma intensiva, se puede eliminar el movimiento original que transporta el resultado al archivo de registros, reduciendo así la presión sobre los puertos del archivo de registros y liberando un registro de propósito general para otras variables temporales. La reducción de la presión sobre los registros , además de simplificar la complejidad requerida del hardware de RF, puede generar un ahorro energético significativo de la CPU , un beneficio importante, especialmente en sistemas embebidos móviles. [ 1 ] [ 2 ]

Estructura

Los procesadores TTA están construidos con unidades funcionales independientes y bancos de registros , que están conectados mediante buses de transporte y zócalos .

Partes del transporte desencadenaron la arquitectura

Unidad funcional

Cada unidad funcional implementa una o más operaciones , que implementan funcionalidades que van desde una simple suma de números enteros hasta un cálculo complejo y arbitrario definido por el usuario y específico de la aplicación. Los operandos para las operaciones se transfieren a través de los puertos de la unidad funcional .

Cada unidad funcional puede tener una tubería independiente . Si una unidad funcional está completamente segmentada , se puede iniciar una nueva operación que tarda varios ciclos de reloj en finalizar en cada ciclo. Por otro lado, una tubería puede configurarse de tal manera que no siempre acepte solicitudes de inicio de nuevas operaciones mientras una anterior aún se esté ejecutando.

El acceso a la memoria de datos y la comunicación con el exterior del procesador se gestionan mediante unidades funcionales especiales. Estas unidades, que implementan operaciones de acceso a la memoria y se conectan a un módulo de memoria, suelen denominarse unidades de carga/almacenamiento .

Unidad de control

La unidad de control es un caso especial de unidad funcional que controla la ejecución de los programas. La unidad de control tiene acceso a la memoria de instrucciones para obtener las instrucciones que se ejecutarán. Para permitir que los programas ejecutados transfieran la ejecución (salten) a una posición arbitraria dentro del programa, la unidad de control proporciona operaciones de control de flujo. Una unidad de control generalmente cuenta con una tubería de instrucciones , que consta de etapas para obtener, decodificar y ejecutar las instrucciones del programa.

Archivos de registro

Los bancos de registros contienen registros de propósito general , que se utilizan para almacenar variables en los programas. Al igual que las unidades de función, los bancos de registros también tienen puertos de entrada y salida. El número de puertos de lectura y escritura, es decir, la capacidad de leer y escribir en varios registros en un mismo ciclo de reloj, puede variar en cada banco de registros.

Autobuses de transporte y enchufes

La arquitectura de interconexión consta de buses de transporte conectados a los puertos de las unidades funcionales mediante zócalos . Debido al coste de la conectividad, se suele reducir el número de conexiones entre las unidades (unidades funcionales y registros). Se dice que una TTA está completamente conectada si existe una ruta desde el puerto de salida de cada unidad hasta los puertos de entrada de todas las demás unidades.

Los zócalos permiten programar los procesadores TTA, ya que posibilitan la selección de las conexiones bus-puerto del zócalo que se habilitan en cada instante. De este modo, se pueden programar las transferencias de datos que tienen lugar en un ciclo de reloj definiendo la conexión zócalo/puerto 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 mediante guardas . Cada transporte de datos puede condicionarse mediante una guarda, que se conecta a un registro (generalmente un registro condicional de 1 bit ) y a un bus. Si el valor del registro de la guarda es falso (cero), el transporte de datos programado para el bus al que está conectada la guarda se anula , es decir, no se escribe en su destino. Los transportes de datos incondicionales no están conectados a ninguna guarda y siempre se ejecutan.

Sucursales

Todos los procesadores, incluidos los procesadores TTA, incluyen instrucciones de control de flujo que modifican el contador de programa, las cuales se utilizan para implementar subrutinas , condicionales (if-then-else) , bucles for , etc. El lenguaje ensamblador para procesadores TTA normalmente incluye instrucciones de control de flujo tales como saltos incondicionales (JUMP), saltos relativos condicionales (BNZ), llamadas a subrutinas (CALL), retornos condicionales (RETNZ), etc., que se ven igual que las instrucciones correspondientes en lenguaje ensamblador para otros procesadores.

Al igual que todas las demás operaciones en una máquina TTA, estas instrucciones se implementan como instrucciones de "movimiento" a una unidad de función especial.

Las implementaciones de TTA que admiten 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 de programa. [ 3 ] [ 4 ]

Las implementaciones de TTA que solo admiten transportes de datos incondicionales, como el MAXQ integrado de Maxim , [ 5 ] suelen tener una unidad de función especial estrechamente conectada al contador de 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 de programa: cada instrucción de "salto relativo < condición > " tiene una dirección de destino diferente para cada condición; y otras direcciones de destino se utilizan para CALL, RETNZ, etc.

Programación

En las arquitecturas de procesadores más tradicionales, un procesador se programa generalmente definiendo las operaciones que se ejecutan y sus operandos. Por ejemplo, una instrucción de suma en una arquitectura RISC podría tener el siguiente aspecto.

sumar 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 la traduce a señales de control que gestionan las conexiones de la red de interconexión y las unidades funcionales. La red de interconexión se utiliza para transferir los valores actuales de los registros r1 y r2 a la unidad funcional capaz de ejecutar la suma, a menudo denominada ALU (Unidad Aritmético-Lógica). Finalmente, una señal de control selecciona y activa la operación de suma en la ALU, cuyo resultado se transfiere de nuevo al registro r3.

Los programas TTA no definen las operaciones, sino únicamente los transportes de datos necesarios para escribir y leer los valores de los operandos. La operación en sí se activa escribiendo datos en un operando desencadenante . Por lo tanto, una operación se ejecuta como un efecto secundario del transporte de datos desencadenante. En consecuencia, 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 registros 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 puede utilizarse en paralelo en el mismo ciclo de reloj. Por lo tanto, es posible aprovechar el paralelismo a nivel de transporte de datos programando varios transportes de datos en la misma instrucción.

En un procesador TTA se puede realizar una operación de suma de la siguiente manera:

r1 -> ALU.operando1 r2 -> ALU.add.trigger ALU.resultado -> r3 

El segundo paso, una escritura en el segundo operando de la unidad de función denominada ALU, activa la operación de suma. Esto hace que el resultado de la suma esté disponible en el puerto de salida 'result' tras la latencia de ejecución de la operación 'add'.

Los puertos asociados a la ALU pueden actuar como un acumulador , permitiendo la creación de instrucciones macro que abstraen la TTA subyacente:

lda r1 ; "cargar ALU": mueve el valor al operando 1 de la ALU add r2 ; add: mueve el valor al disparador de suma sta r3 ; "almacenar ALU": mueve el valor del resultado de la ALU

Latencia de operación visible para el programador

La filosofía principal de las TTA es trasladar la complejidad del hardware al software. Debido a esto, se introducen varios riesgos adicionales para el programador. Uno de ellos son las ranuras de retardo , la latencia de operación visible para el programador de las unidades de función. La temporización es responsabilidad exclusiva del programador. El programador debe programar las instrucciones de manera que el resultado no se lea ni demasiado pronto ni demasiado tarde. No existe detección de hardware para bloquear el procesador en caso de que un resultado se lea demasiado pronto. Consideremos, por ejemplo, una arquitectura que tiene una operación de suma con una latencia de 1, y una operación de multiplicación con una latencia de 3. Al activar la operación de suma , es posible leer el resultado en la siguiente instrucción (siguiente ciclo de reloj), pero en el caso de la multiplicación , hay que esperar dos instrucciones antes de que se pueda leer el resultado. El resultado está listo para la tercera instrucción después de la instrucción de activación.

Leer un resultado demasiado pronto conlleva leer el resultado de una operación previamente activada o, si no se activó ninguna operación en la unidad de función, el valor leído queda indefinido. Por otro lado, el resultado debe leerse con la suficiente antelación para garantizar 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 gran cantidad de contexto del procesador visible para el programador, que incluye, además del contenido del archivo de registros, el contenido de los registros de la tubería de la unidad de función y/o los puertos de entrada y salida de la unidad de función, el guardado de contexto necesario para la compatibilidad con interrupciones externas puede resultar complejo y costoso de implementar en un procesador TTA. Por lo tanto, los procesadores TTA generalmente no admiten interrupciones, sino que delegan su tarea a un hardware externo (por ejemplo, un procesador de E/S) o evitan su necesidad mediante el uso de un mecanismo alternativo de sincronización/comunicación, como el sondeo.

Implementaciones

  • MAXQ [ 6 ] [ 5 ] [ 7 ] de Maxim Integrated , el único microcontrolador disponible comercialmente construido sobre una arquitectura activada por transporte, es un OISC o " computadora de 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 de programa .
  • El proyecto "move" ha diseñado y fabricado varios microprocesadores TTA experimentales.
  • OpenASIP es un conjunto de herramientas de código abierto para conjuntos de instrucciones específicos de aplicaciones que utiliza TTA como plantilla de procesador.
  • La arquitectura del Amiga Copper posee todas las características básicas de una arquitectura controlada por transporte.
  • El procesador Able fue desarrollado por New England Digital .
  • El ordenador basado en WireWorld .
  • El Dr. Dobb publicó One-Der, un TTA de 32 bits en Verilog con un ensamblador cruzado y un compilador Forth correspondientes. [ 8 ] [ 9 ]
  • El procesador de vértices Mali (200/400) utiliza un escalar de punto flotante de precisión simple TTA con una palabra de instrucción de 128 bits .

Véase también

Referencias

  1. ^ V. Guzma, P. Jääskeläinen, P. Kellomäki y J. Takala, "Impacto de la omisión de software en el paralelismo a nivel de instrucción y el tráfico de archivos de registro"
  2. Johan Janssen. "Estrategias de compilación para arquitecturas activadas por transporte". Archivado el 6 de agosto de 2020 en Wayback Machine . 2001. pág. 168.
  3. Henk Corporaal. "Arquitecturas activadas por transporte examinadas para aplicaciones de propósito general" . pág. 6.
  4. Aliaksei V. Chapyzhenka. "sTTAck: Stack Transport Triggered Architecture" Archivado el 5 de marzo de 2016 en Wayback Machine .
  5. 1 2 "Guía del usuario de la familia MAXQ" . Maxim Integrated . Sección "1.1 Conjunto de instrucciones". Una arquitectura basada en registros y activada por transporte 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 o ubicación de memoria de destino, o a mover datos entre registros y/o ubicaciones de memoria.
  6. Catsoulis, John (2005), Diseño de hardware embebido (2.ª ed.), O'Reilly Media , págs. 327–333 , ISBN   978-0-596-00755-3
  7. "Introducción a la arquitectura MAXQ" . Maxim Integrated . Acceso centralizado a recursos (incluye diagrama de mapa de transferencia). Archivado del original el 15/05/2022 . Consultado el 15/05/2022 .
  8. "Artículo del Dr. Dobb con CPU FPGA de 32 bits en Verilog" . Archivado del original el 23 de enero de 2010. Consultado el 18 de noviembre de 2009 .
  9. "Sitio web con más detalles sobre la CPU del Dr. Dobb" . Consultado el 25 de noviembre de 2010 .
  • Proyecto MOVE: Síntesis automática de procesadores específicos para aplicaciones (accesible a través de Wayback Machine)
    • Ventajas de las arquitecturas activadas por transporte
  • Arquitecturas de microprocesadores desde VLIW hasta TTA. Archivado el 3 de marzo de 2016 en Wayback Machine.
  • Artículo de resumen de BYTE