En ingeniería informática , la microarquitectura , también llamada organización informática y a veces abreviada como µarch o uarch , es la forma en que se implementa una arquitectura de conjunto de instrucciones (ISA) en un procesador en particular . [1] Una ISA determinada puede implementarse con diferentes microarquitecturas; [2] [3] las implementaciones pueden variar debido a diferentes objetivos de un diseño dado o debido a cambios en la tecnología. [4]
La arquitectura informática es la combinación de microarquitectura y arquitectura de conjunto de instrucciones.
Relación con la arquitectura del conjunto de instrucciones
El ISA es aproximadamente el mismo que el modelo de programación de un procesador visto por un programador de lenguaje ensamblador o un escritor de compiladores. El ISA incluye el modelo de ejecución , los registros del procesador , la dirección y los formatos de datos, entre otras cosas. La microarquitectura incluye las partes constituyentes del procesador y cómo estos se interconectan e interoperan para implementar la ISA.
La microarquitectura de una máquina generalmente se representa como diagramas (más o menos detallados) que describen las interconexiones de los diversos elementos de microarquitectura de la máquina, que pueden ser desde compuertas y registros simples, hasta unidades lógicas aritméticas completas (ALU) e incluso más grandes elementos. Estos diagramas generalmente separan la ruta de datos (donde se colocan los datos) y la ruta de control (que se puede decir que dirige los datos). [5]
La persona que diseña un sistema suele dibujar la microarquitectura específica como una especie de diagrama de flujo de datos . Como un diagrama de bloques , el diagrama de microarquitectura muestra elementos de microarquitectura como la unidad aritmética y lógica y el archivo de registro como un solo símbolo esquemático. Normalmente, el diagrama conecta esos elementos con flechas, líneas gruesas y líneas finas para distinguir entre buses de tres estados (que requieren un búfer de tres estados para cada dispositivo que impulsa el bus), buses unidireccionales (siempre impulsados por una sola fuente, como ya que la forma en que el bus de direcciones en computadoras más simples siempre está controlado por el registro de direcciones de memoria ) y líneas de control individuales. Las computadoras muy simples tienen una sola organización de bus de datos : tienen un solo bus de tres estados . El diagrama de computadoras más complejas generalmente muestra múltiples buses de tres estados, que ayudan a la máquina a realizar más operaciones simultáneamente.
Cada elemento de la microarquitectura está representado a su vez por un esquema que describe las interconexiones de las puertas lógicas utilizadas para implementarlo. Cada puerta lógica está representada a su vez por un diagrama de circuito que describe las conexiones de los transistores utilizados para implementarla en alguna familia lógica en particular . Las máquinas con diferentes microarquitecturas pueden tener la misma arquitectura de conjunto de instrucciones y, por lo tanto, ser capaces de ejecutar los mismos programas. Las nuevas microarquitecturas y / o soluciones de circuitos, junto con los avances en la fabricación de semiconductores, son lo que permite que las nuevas generaciones de procesadores logren un mayor rendimiento utilizando el mismo ISA.
En principio, una sola microarquitectura podría ejecutar varias ISA diferentes con solo cambios menores en el microcódigo .
Aspectos
La ruta de datos canalizada es el diseño de ruta de datos más utilizado en la actualidad en la microarquitectura. Esta técnica se utiliza en la mayoría de los microprocesadores, microcontroladores y DSP modernos . La arquitectura canalizada permite que múltiples instrucciones se superpongan en la ejecución, al igual que una línea de montaje. El pipeline incluye varias etapas diferentes que son fundamentales en los diseños de microarquitectura. [5] Algunas de estas etapas incluyen búsqueda de instrucciones, decodificación de instrucciones, ejecución y escritura. Algunas arquitecturas incluyen otras etapas como el acceso a la memoria. El diseño de tuberías es una de las tareas centrales de la microarquitectura.
Las unidades de ejecución también son esenciales para la microarquitectura. Las unidades de ejecución incluyen unidades lógicas aritméticas (ALU), unidades de punto flotante (FPU), unidades de carga / almacenamiento, predicción de sucursales y SIMD . Estas unidades realizan las operaciones o cálculos del procesador. La elección del número de unidades de ejecución, su latencia y rendimiento es una tarea central de diseño de microarquitectura. El tamaño, la latencia, el rendimiento y la conectividad de las memorias dentro del sistema también son decisiones de microarquitectura.
Las decisiones de diseño a nivel de sistema , como incluir o no periféricos , como controladores de memoria , pueden considerarse parte del proceso de diseño de microarquitectura. Esto incluye decisiones sobre el nivel de rendimiento y la conectividad de estos periféricos.
A diferencia del diseño arquitectónico, donde lograr un nivel de rendimiento específico es el objetivo principal, el diseño de microarquitectura presta más atención a otras limitaciones. Dado que las decisiones de diseño de microarquitectura afectan directamente lo que entra en un sistema, se debe prestar atención a cuestiones como el área / costo del chip, el consumo de energía, la complejidad lógica, la facilidad de conectividad, la capacidad de fabricación, la facilidad de depuración y la capacidad de prueba.
Conceptos de microarquitectura
Ciclos de instrucción
Para ejecutar programas, todas las CPU de un solo chip o de varios chips:
- Leer una instrucción y decodificarla
- Encuentre cualquier dato asociado que sea necesario para procesar la instrucción
- Procesar la instrucción
- Escribe los resultados
El ciclo de instrucción se repite continuamente hasta que se apaga la alimentación.
Microarquitectura multiciclo
Históricamente, las primeras computadoras fueron diseños multiciclo. Las computadoras más pequeñas y menos costosas a menudo todavía usan esta técnica. Las arquitecturas multiciclo utilizan a menudo la menor cantidad total de elementos lógicos y cantidades razonables de potencia. Pueden diseñarse para tener una sincronización determinista y una alta confiabilidad. En particular, no tienen una tubería que se detenga al tomar ramas condicionales o interrupciones. Sin embargo, otras microarquitecturas suelen realizar más instrucciones por unidad de tiempo, utilizando la misma familia lógica. Cuando se habla de "rendimiento mejorado", una mejora suele estar relacionada con un diseño multiciclo.
En una computadora multiciclo, la computadora realiza los cuatro pasos en secuencia, durante varios ciclos del reloj. Algunos diseños pueden realizar la secuencia en dos ciclos de reloj completando etapas sucesivas en bordes de reloj alternativos, posiblemente con operaciones más largas que ocurren fuera del ciclo principal. Por ejemplo, la etapa uno en el borde ascendente del primer ciclo, la etapa dos en el borde descendente del primer ciclo, etc.
En la lógica de control, la combinación de contador de ciclos, estado de ciclo (alto o bajo) y los bits del registro de decodificación de instrucciones determinan exactamente lo que debe hacer cada parte de la computadora. Para diseñar la lógica de control, se puede crear una tabla de bits que describa las señales de control a cada parte de la computadora en cada ciclo de cada instrucción. Luego, esta tabla lógica se puede probar en una simulación de software que ejecuta un código de prueba. Si la tabla lógica se coloca en una memoria y se utiliza para ejecutar una computadora real, se denomina microprograma . En algunos diseños de computadora, la tabla lógica se optimiza en forma de lógica combinacional hecha de puertas lógicas, generalmente usando un programa de computadora que optimiza la lógica. Las primeras computadoras usaban un diseño lógico ad-hoc para el control hasta que Maurice Wilkes inventó este enfoque tabular y lo llamó microprogramación. [6]
Aumento de la velocidad de ejecución
Para complicar esta serie de pasos de apariencia simple, está el hecho de que la jerarquía de la memoria, que incluye el almacenamiento en caché , la memoria principal y el almacenamiento no volátil como los discos duros (donde residen las instrucciones del programa y los datos), siempre ha sido más lenta que el propio procesador. El paso (2) a menudo introduce un retraso prolongado (en términos de CPU) mientras los datos llegan por el bus de la computadora . Se ha realizado una investigación considerable en diseños que eviten estos retrasos tanto como sea posible. A lo largo de los años, un objetivo central fue ejecutar más instrucciones en paralelo, aumentando así la velocidad de ejecución efectiva de un programa. Estos esfuerzos introdujeron complicadas estructuras lógicas y de circuitos. Inicialmente, estas técnicas solo podían implementarse en computadoras centrales o supercomputadoras costosas debido a la cantidad de circuitos necesarios para estas técnicas. A medida que avanzaba la fabricación de semiconductores, se podrían implementar más y más de estas técnicas en un solo chip semiconductor. Vea la ley de Moore .
Elección del conjunto de instrucciones
Los conjuntos de instrucciones han cambiado a lo largo de los años, desde originalmente muy simples hasta a veces muy complejos (en varios aspectos). En los últimos años, las arquitecturas de almacenamiento de carga , los tipos VLIW y EPIC han estado de moda. Las arquitecturas que se ocupan del paralelismo de datos incluyen SIMD y Vectores . Algunas etiquetas utilizadas para denotar clases de arquitecturas de CPU no son particularmente descriptivas, especialmente la etiqueta CISC; muchos de los primeros diseños denominados retroactivamente " CISC " son de hecho significativamente más simples que los procesadores RISC modernos (en varios aspectos).
Sin embargo, la elección de la arquitectura del conjunto de instrucciones puede afectar en gran medida la complejidad de implementar dispositivos de alto rendimiento. La estrategia principal, utilizada para desarrollar los primeros procesadores RISC, fue simplificar las instrucciones a un mínimo de complejidad semántica individual combinada con una alta regularidad y simplicidad de codificación. Dichas instrucciones uniformes se recuperaron, decodificaron y ejecutaron fácilmente en forma de canalizaciones y una estrategia simple para reducir el número de niveles lógicos con el fin de alcanzar altas frecuencias de operación; las memorias caché de instrucciones compensaron la frecuencia operativa más alta y la densidad de código inherentemente baja , mientras que se utilizaron conjuntos de registros grandes para factorizar la mayor cantidad posible de accesos (lentos) a la memoria.
Canalización de instrucciones
Una de las primeras y más poderosas técnicas para mejorar el rendimiento es el uso de canalización de instrucciones . Los primeros diseños de procesadores llevarían a cabo todos los pasos anteriores para una instrucción antes de pasar a la siguiente. Grandes porciones de los circuitos se dejaron inactivos en cualquier paso; por ejemplo, el circuito de decodificación de instrucciones estaría inactivo durante la ejecución y así sucesivamente.
La canalización mejora el rendimiento al permitir que varias instrucciones pasen por el procesador al mismo tiempo. En el mismo ejemplo básico, el procesador comenzaría a decodificar (paso 1) una nueva instrucción mientras la última esperaba resultados. Esto permitiría que hasta cuatro instrucciones estuvieran "en vuelo" al mismo tiempo, haciendo que el procesador pareciera cuatro veces más rápido. Aunque cualquier instrucción tarda el mismo tiempo en completarse (todavía hay cuatro pasos), la CPU en su conjunto "retira" las instrucciones mucho más rápido.
RISC hace que las tuberías sean más pequeñas y mucho más fáciles de construir al separar limpiamente cada etapa del proceso de instrucción y hacer que tomen la misma cantidad de tiempo: un ciclo. El procesador en su conjunto opera en forma de línea de ensamblaje , con instrucciones que vienen de un lado y los resultados del otro. Debido a la complejidad reducida de la canalización RISC clásica , el núcleo canalizado y una memoria caché de instrucciones podrían colocarse en un troquel del mismo tamaño que, de otro modo, encajaría solo en el núcleo en un diseño CISC. Esta fue la verdadera razón por la que RISC fue más rápido. Los primeros diseños como SPARC y MIPS a menudo funcionaban 10 veces más rápido que las soluciones CISC de Intel y Motorola a la misma velocidad de reloj y precio.
Las tuberías no se limitan de ninguna manera a los diseños RISC. En 1986, la implementación VAX de primera línea ( VAX 8800 ) era un diseño muy estructurado, ligeramente anterior a los primeros diseños comerciales MIPS y SPARC. La mayoría de las CPU modernas (incluso las CPU integradas) ahora están canalizadas, y las CPU microcodificadas sin canalización solo se ven en la mayoría de los procesadores integrados con restricciones de área. [ se necesitan ejemplos ] Las máquinas CISC grandes, desde el VAX 8800 hasta los modernos Pentium 4 y Athlon, se implementan tanto con microcódigo como con pipelines. Las mejoras en la canalización y el almacenamiento en caché son los dos principales avances de la microarquitectura que han permitido que el rendimiento del procesador se mantenga al día con la tecnología de circuitos en la que se basan.
Cache
No pasó mucho tiempo antes de que las mejoras en la fabricación de chips permitieran colocar aún más circuitos en el dado, y los diseñadores comenzaron a buscar formas de usarlos. Uno de los más comunes fue agregar una cantidad cada vez mayor de memoria caché en la matriz. La caché es simplemente una memoria muy rápida. Se puede acceder en unos pocos ciclos en lugar de muchos necesarios para "hablar" con la memoria principal. La CPU incluye un controlador de caché que automatiza la lectura y escritura desde el caché. Si los datos ya están en la caché, simplemente "aparecen", mientras que si no lo están, el procesador se "detiene" mientras el controlador de la caché los lee.
Los diseños de RISC comenzaron a agregar caché a mediados o finales de la década de 1980, a menudo solo 4 KB en total. Este número creció con el tiempo, y las CPU típicas ahora tienen al menos 512 KB, mientras que las CPU más potentes vienen con 1 o 2 o incluso 4, 6, 8 o 12 MB, organizadas en varios niveles de una jerarquía de memoria . En términos generales, más caché significa más rendimiento, debido a la reducción del estancamiento.
Los cachés y las canalizaciones eran una combinación perfecta entre sí. Anteriormente, no tenía mucho sentido construir una canalización que pudiera ejecutarse más rápido que la latencia de acceso de la memoria fuera del chip. El uso de memoria caché en chip en su lugar significaba que una canalización podía ejecutarse a la velocidad de la latencia de acceso a la caché, un período de tiempo mucho menor. Esto permitió que las frecuencias operativas de los procesadores aumentaran a un ritmo mucho más rápido que el de la memoria fuera del chip.
Predicción de rama
Una barrera para lograr un mayor rendimiento a través del paralelismo a nivel de instrucción proviene de los bloqueos y descargas de la tubería debido a las ramificaciones. Normalmente, no se sabe si se tomará una rama condicional hasta el final del proceso, ya que las ramas condicionales dependen de los resultados provenientes de un registro. Desde el momento en que el decodificador de instrucciones del procesador se da cuenta de que ha encontrado una instrucción de bifurcación condicional hasta el momento en que se puede leer el valor de registro decisivo, la canalización debe detenerse durante varios ciclos, o si no lo es y la bifurcación está tomado, la tubería necesita ser descargada. A medida que aumentan las velocidades del reloj, la profundidad de la tubería aumenta con ella, y algunos procesadores modernos pueden tener 20 etapas o más. En promedio, cada quinta instrucción ejecutada es una rama, por lo que sin ninguna intervención, es una gran cantidad de estancamiento.
Se utilizan técnicas como la predicción de rama y la ejecución especulativa para reducir estas penalizaciones de rama. La predicción de rama es donde el hardware hace conjeturas fundamentadas sobre si se tomará una rama en particular. En realidad, un lado u otro de la rama se llamará con mucha más frecuencia que el otro. Los diseños modernos tienen sistemas de predicción estadística bastante complejos, que observan los resultados de las ramas pasadas para predecir el futuro con mayor precisión. La conjetura permite que el hardware obtenga instrucciones previamente sin esperar a que se lea el registro. La ejecución especulativa es una mejora adicional en la que el código a lo largo de la ruta predicha no solo se recupera previamente, sino que también se ejecuta antes de saber si la rama debe tomarse o no. Esto puede producir un mejor rendimiento cuando la conjetura es buena, con el riesgo de una gran penalización cuando la conjetura es mala porque las instrucciones deben deshacerse.
Superescalar
Incluso con toda la complejidad añadida y las puertas necesarias para respaldar los conceptos descritos anteriormente, las mejoras en la fabricación de semiconductores pronto permitieron utilizar incluso más puertas lógicas.
En el esquema anterior, el procesador procesa partes de una sola instrucción a la vez. Los programas de computadora podrían ejecutarse más rápido si se procesaran varias instrucciones simultáneamente. Esto es lo que logran los procesadores superescalares al replicar unidades funcionales como las ALU. La replicación de unidades funcionales solo fue posible cuando el área de la matriz de un procesador de un solo problema ya no extendía los límites de lo que se podía fabricar de manera confiable. A fines de la década de 1980, los diseños superescalares comenzaron a ingresar al mercado.
En los diseños modernos, es común encontrar dos unidades de carga, una tienda (muchas instrucciones no tienen resultados para almacenar), dos o más unidades matemáticas enteras, dos o más unidades de coma flotante y, a menudo, una unidad SIMD de algún tipo. La lógica de emisión de instrucciones aumenta en complejidad al leer una enorme lista de instrucciones de la memoria y entregarlas a las diferentes unidades de ejecución que están inactivas en ese momento. Luego, los resultados se recopilan y se reordenan al final.
Ejecución fuera de orden
La adición de cachés reduce la frecuencia o la duración de los bloqueos debido a la espera de que se obtengan datos de la jerarquía de memoria, pero no elimina estos bloqueos por completo. En los primeros diseños, una falta de caché obligaría al controlador de caché a detener el procesador y esperar. Por supuesto, puede haber alguna otra instrucción en el programa cuyos datos está disponible en la caché en ese punto. La ejecución fuera de orden permite que la instrucción preparada se procese mientras una instrucción anterior espera en la caché, luego reordena los resultados para que parezca que todo sucedió en el orden programado. Esta técnica también se usa para evitar otras paradas de dependencia de operandos, como una instrucción que espera un resultado de una operación de punto flotante de latencia larga u otras operaciones de ciclos múltiples.
Registro de cambio de nombre
El cambio de nombre de registros se refiere a una técnica utilizada para evitar la ejecución serializada innecesaria de instrucciones de programa debido a la reutilización de los mismos registros por parte de esas instrucciones. Suponga que tenemos dos grupos de instrucción que usarán el mismo registro . Un conjunto de instrucciones se ejecuta primero para dejar el registro al otro conjunto, pero si el otro conjunto se asigna a un registro similar diferente, ambos conjuntos de instrucciones se pueden ejecutar en paralelo (o) en serie.
Multiprocesamiento y multiproceso
Los arquitectos informáticos se han visto obstaculizados por el creciente desajuste en las frecuencias operativas de la CPU y los tiempos de acceso a la DRAM . Ninguna de las técnicas que explotaban el paralelismo a nivel de instrucción (ILP) dentro de un programa podía compensar las largas paradas que se producían cuando los datos tenían que obtenerse de la memoria principal. Además, la gran cantidad de transistores y las altas frecuencias operativas necesarias para las técnicas de ILP más avanzadas requerían niveles de disipación de potencia que ya no podían enfriarse de forma económica. Por estas razones, las nuevas generaciones de computadoras han comenzado a explotar los niveles más altos de paralelismo que existen fuera de un solo programa o subproceso de programa .
Esta tendencia a veces se conoce como computación de rendimiento . Esta idea se originó en el mercado de mainframe, donde el procesamiento de transacciones en línea enfatizaba no solo la velocidad de ejecución de una transacción, sino la capacidad de lidiar con cantidades masivas de transacciones. Dado que las aplicaciones basadas en transacciones, como el enrutamiento de red y el servicio de sitios web, han aumentado considerablemente en la última década, la industria informática ha vuelto a enfatizar los problemas de capacidad y rendimiento.
Una técnica de cómo se logra este paralelismo es a través de sistemas de multiprocesamiento , sistemas informáticos con múltiples CPU. Una vez reservados para mainframes y supercomputadoras de alta gama , los servidores multiprocesadores de pequeña escala (2 a 8) se han convertido en algo común para el mercado de las pequeñas empresas. Para las grandes corporaciones, los multiprocesadores a gran escala (16-256) son comunes. Incluso las computadoras personales con múltiples CPU han aparecido desde la década de 1990.
Con más reducciones de tamaño transistor disponible con la tecnología avanza semiconductor, CPUs multi-núcleo han aparecido en varias CPU se implementan en el mismo chip de silicio. Inicialmente utilizado en chips destinados a mercados integrados, donde CPU más simples y más pequeñas permitirían que múltiples instancias encajen en una pieza de silicio. En 2005, la tecnología de semiconductores permitió fabricar en volumen chips CMP de CPU de escritorio de alta gama duales . Algunos diseños, como el UltraSPARC T1 de Sun Microsystems , han vuelto a diseños más simples (escalares, en orden) para adaptarse a más procesadores en una sola pieza de silicio.
Otra técnica que se ha vuelto más popular recientemente es el multihilo . En el subproceso múltiple, cuando el procesador tiene que recuperar datos de la memoria lenta del sistema, en lugar de detenerse para que lleguen los datos, el procesador cambia a otro programa o subproceso de programa que está listo para ejecutarse. Aunque esto no acelera un programa / subproceso en particular, aumenta el rendimiento general del sistema al reducir el tiempo que la CPU está inactiva.
Conceptualmente, el subproceso múltiple es equivalente a un cambio de contexto en el nivel del sistema operativo. La diferencia es que una CPU multiproceso puede realizar un cambio de hilo en un ciclo de CPU en lugar de los cientos o miles de ciclos de CPU que normalmente requiere un cambio de contexto. Esto se logra replicando el hardware de estado (como el archivo de registro y el contador del programa ) para cada subproceso activo.
Una mejora adicional es el multiproceso simultáneo . Esta técnica permite que las CPU superescalares ejecuten instrucciones de diferentes programas / subprocesos simultáneamente en el mismo ciclo.
Ver también
- Unidad de control
- Arquitectura de hardware
- Lenguaje de descripción de hardware (HDL)
- Paralelismo a nivel de instrucción (ILP)
- Lista de microarquitecturas de CPU de AMD
- Lista de microarquitecturas de CPU Intel
- Diseño de procesador
- Procesamiento de flujo
- VHDL
- Integración a muy gran escala (VLSI)
- Verilog
Referencias
- ^ Directrices del plan de estudios para programas de licenciatura en ingeniería informática (PDF) . Asociación para Maquinaria de Computación. 2004. p. 60.
Comentarios sobre la arquitectura y organización de la computadora: La arquitectura de la computadora es un componente clave de la ingeniería informática y el ingeniero informático en ejercicio debe tener una comprensión práctica de este tema ...
- ^ Murdocca, Miles; Heuring, Vincent (2007). Arquitectura y organización de computadoras, un enfoque integrado . Wiley. pag. 151. ISBN 9780471733881.
- ^ Clements, Alan. Principios de hardware informático (4ª ed.). págs. 1-2.
- ^ Flynn, Michael J. (2007). "Introducción a la arquitectura y las máquinas" . Arquitectura informática Diseño de procesadores en paralelo y en canalización . Jones y Bartlett. págs. 1-3. ISBN 9780867202045.
- ^ a b Hennessy, John L .; Patterson, David A. (2006). Arquitectura informática: un enfoque cuantitativo (4ª ed.). Morgan Kaufmann. ISBN 0-12-370490-1.
- ^ Wilkes, MV (1969). "El crecimiento del interés en la microprogramación: una encuesta de literatura". Encuestas de computación ACM . 1 (3): 139-145. doi : 10.1145 / 356551.356553 . S2CID 10673679 .
Otras lecturas
- Patterson, D .; Hennessy, J. (2004). Organización y diseño de computadoras: la interfaz hardware / software . Morgan Kaufmann. ISBN 1-55860-604-1.
- Hamacher, VC; Vrasenic, ZG; Zaky, SG (2001). Organización informática . McGraw-Hill. ISBN 0-07-232086-9.
- Stallings, William (2002). Organización y Arquitectura de Computadores . Prentice Hall. ISBN 0-13-035119-9.
- Hayes, JP (2002). Arquitectura y Organización de Computadores . McGraw-Hill. ISBN 0-07-286198-3.
- Schneider, Gary Michael (1985). Los principios de la organización informática . Wiley. págs. 6–7 . ISBN 0-471-88552-5.
- Mano, M. Morris (1992). Arquitectura de sistemas informáticos . Prentice Hall. pag. 3 . ISBN 0-13-175563-3.
- Abd-El-Barr, Mostafa; El-Rewini, Hesham (2004). Fundamentos de Organización y Arquitectura de Computadores . Wiley. pag. 1. ISBN 0-471-46741-3.
- Gardner, J (2001). "Microarquitectura de Procesador de PC" . ExtremeTech.
- Gilreath, William F .; Laplante, Phillip A. (2012) [2003]. Arquitectura informática: una perspectiva minimalista . Saltador. ISBN 978-1-4615-0237-1.
- Patterson, David A. (10 de octubre de 2018). Una nueva edad de oro para la arquitectura informática . US Berkeley ACM AM Turing Laureate Colloquium. ctwj53r07yI.