stringtranslate.com

Microarquitectura

Diagrama de la microarquitectura Intel Core 2

En electrónica , informática e 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 determinada arquitectura de conjunto de instrucciones (ISA) en un procesador particular . [1] Una ISA determinada puede implementarse con diferentes microarquitecturas; [2] [3] las implementaciones pueden variar debido a diferentes objetivos de un diseño determinado 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

Una microarquitectura organizada en torno a un único autobús

El ISA es aproximadamente el mismo que el modelo de programación de un procesador visto por un programador en lenguaje ensamblador o un compilador. La ISA incluye las instrucciones , 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 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 distintos elementos de la microarquitectura de la máquina, que pueden ser desde puertas y registros individuales hasta unidades aritméticas lógicas (ALU) completas 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 . Al igual que 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 único 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 única fuente, como (como la forma en que el bus de direcciones en las computadoras más simples siempre está controlado por el registro de direcciones de la memoria ) y líneas de control individuales. Las computadoras muy simples tienen una única organización de bus de datos  : tienen un único 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 microarquitectónico está a su vez representado por un esquema que describe las interconexiones de las puertas lógicas utilizadas para implementarlo. Cada puerta lógica está a su vez representada por un diagrama de circuito que describe las conexiones de los transistores utilizados para implementarla en alguna familia lógica particular . Máquinas con diferentes microarquitecturas pueden tener la misma arquitectura de conjunto de instrucciones y, por 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 permiten a las nuevas generaciones de procesadores lograr un mayor rendimiento utilizando el mismo ISA.

En principio, una única microarquitectura podría ejecutar varios ISA diferentes con sólo cambios menores en el microcódigo .

Aspectos

Microarquitectura Intel 80286

La ruta de datos canalizada es el diseño de ruta de datos más utilizado en la microarquitectura actual. Esta técnica se utiliza en la mayoría de los microprocesadores, microcontroladores y DSP modernos . La arquitectura canalizada permite que varias instrucciones se superpongan en la ejecución, de forma muy parecida a una línea de montaje. El proceso incluye varias etapas diferentes que son fundamentales en los diseños de microarquitectura. [5] Algunas de estas etapas incluyen la búsqueda de instrucciones, la decodificación de instrucciones, la ejecución y la reescritura. 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 aritméticas lógicas (ALU), unidades de punto flotante (FPU), unidades de carga/almacenamiento, predicción de rama 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 del 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 el objetivo principal es lograr un nivel de rendimiento específico, el diseño microarquitectónico 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 uno o varios chips:

  1. Leer una instrucción y decodificarla.
  2. Encuentre cualquier dato asociado que sea necesario para procesar la instrucción.
  3. Procesar la instrucción
  4. 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 de ciclos múltiples. Las computadoras más pequeñas y menos costosas todavía utilizan esta técnica. Las arquitecturas multiciclo suelen utilizar la menor cantidad total de elementos lógicos y cantidades razonables de energía. Se pueden diseñar para que tengan una sincronización determinista y una alta confiabilidad. En particular, no tienen ninguna tubería que se detenga al tomar bifurcaciones o interrupciones condicionales. 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 ser relativa a un diseño de ciclos múltiples.

En una computadora de ciclos múltiples, 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 flancos de reloj alternos, posiblemente con operaciones más largas fuera del ciclo principal. Por ejemplo, la etapa uno en el flanco ascendente del primer ciclo, la etapa dos en el flanco descendente del primer ciclo, etc.

En la lógica de control, la combinación del contador de ciclos, el estado del ciclo (alto o bajo) y los bits del registro de decodificación de instrucciones determinan exactamente qué 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 ejecutando código de prueba. Si la tabla lógica se coloca en una memoria y se utiliza para ejecutar una computadora real, se llama 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 utilizaban 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 aparentemente simples, 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 y los datos del programa), 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 a través del bus de la computadora . Se ha investigado mucho sobre diseños que eviten estos retrasos en la medida de lo 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 estructuras lógicas y de circuitos complicadas. Inicialmente, estas técnicas sólo podían implementarse en costosas computadoras centrales o supercomputadoras debido a la cantidad de circuitos necesarios para estas técnicas. A medida que avanzaba la fabricación de semiconductores, se podían implementar cada vez más técnicas de este tipo en un único chip semiconductor. Véase 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 se han puesto de moda las arquitecturas de almacén de carga , de tipo VLIW y EPIC . Las arquitecturas que se ocupan del paralelismo de datos incluyen SIMD y Vectors . Algunas etiquetas utilizadas para indicar 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 destacada, 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. Estas instrucciones uniformes se obtuvieron, decodificaron y ejecutaron fácilmente en forma canalizada y una estrategia simple para reducir el número de niveles lógicos con el fin de alcanzar altas frecuencias operativas; Las memorias caché de instrucciones compensaron la mayor frecuencia operativa y la densidad de código inherentemente baja , mientras que se utilizaron grandes conjuntos de registros para factorizar la mayor cantidad posible de accesos a la memoria (lentos).

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 quedaban inactivas en cualquier paso; por ejemplo, el circuito de decodificación de instrucciones estaría inactivo durante la ejecución, etc.

La canalización mejora el rendimiento al permitir que varias instrucciones avancen a través del 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 espera resultados. Esto permitiría que hasta cuatro instrucciones estuvieran "en vuelo" al mismo tiempo, haciendo que el procesador parezca 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 los pipelines sean más pequeños y mucho más fáciles de construir al separar claramente cada etapa del proceso de instrucción y hacer que tomen la misma cantidad de tiempo: un ciclo. El procesador en su conjunto funciona como una línea de montaje , con las instrucciones entrando por un lado y los resultados por el otro. Debido a la complejidad reducida de la canalización RISC clásica , el núcleo canalizado y un caché de instrucciones podrían colocarse en una matriz del mismo tamaño que, de otro modo, cabría solo en el núcleo en un diseño CISC. Ésta fue la verdadera razón por la que RISC era 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.

Los oleoductos no se limitan de ninguna manera a diseños RISC. En 1986, la implementación VAX de gama alta ( 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 se ven sólo en los procesadores integrados con mayor área restringida. [ se necesitan ejemplos ] Las máquinas CISC grandes, desde la VAX 8800 hasta los modernos Pentium 4 y Athlon, se implementan tanto con microcódigo como con canalizaciones. Las mejoras en la canalización y el almacenamiento en caché son los dos principales avances en la microarquitectura que han permitido que el rendimiento del procesador siga el ritmo de 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 la matriz y los diseñadores comenzaron a buscar formas de utilizarlos. Uno de los más comunes era agregar una cantidad cada vez mayor de memoria caché integrada. La caché es una memoria muy rápida y costosa. Se puede acceder a él en unos pocos ciclos, a diferencia de los muchos necesarios para "hablar" con la memoria principal. La CPU incluye un controlador de caché que automatiza la lectura y escritura desde la caché. Si los datos ya están en la memoria caché, se accede a ellos desde allí, con un ahorro de tiempo considerable, mientras que si no, el procesador se "para" mientras el controlador de la memoria caché los lee.

Los diseños RISC comenzaron a agregar caché a mediados y finales de la década de 1980, a menudo sólo 4 KB en total. Este número creció con el tiempo, y las CPU típicas ahora tienen al menos 2 MB, mientras que las CPU más potentes vienen con 4, 6, 12 MB o incluso 32 MB o más, siendo la mayor parte 768 MB en la línea EPYC Milan-X recientemente lanzada, organizada en Múltiples niveles de una jerarquía de memoria . En términos generales, más caché significa más rendimiento, debido a una reducción del estancamiento.

Los cachés y las canalizaciones eran una combinación perfecta entre sí. Anteriormente, no tenía mucho sentido construir un canal que pudiera ejecutarse más rápido que la latencia de acceso de la memoria fuera del chip. En su lugar, el uso de memoria caché en el chip significaba que una canalización podría ejecutarse a la velocidad de la latencia de acceso a la caché, en 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 sucursales

Una barrera para lograr un mayor rendimiento a través del paralelismo a nivel de instrucción proviene de las paradas y descargas de la tubería debido a las bifurcaciones. Normalmente, no se sabe si se tomará una rama condicional hasta una etapa avanzada 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 ha descubierto que ha encontrado una instrucción de bifurcación condicional hasta el momento en que se puede leer el valor del registro decisivo, la canalización debe detenerse durante varios ciclos, o si no es así y la bifurcación se detiene. tomado, es necesario lavar la tubería. A medida que aumentan las velocidades de reloj, la profundidad de la tubería aumenta con ella, y algunos procesadores modernos pueden tener 20 etapas o más. En promedio, una de cada cinco instrucciones ejecutadas es una rama, por lo que, sin ninguna intervención, se produce una gran cantidad de estancamiento.

Se utilizan técnicas como la predicción de sucursales y la ejecución especulativa para reducir estas penalizaciones de sucursales. La predicción de sucursales es donde el hardware hace conjeturas fundamentadas sobre si se tomará una sucursal en particular. En realidad, se llamará a un lado u otro de la sucursal con mucha más frecuencia que al otro. Los diseños modernos tienen sistemas de predicción estadística bastante complejos, que observan los resultados de ramas pasadas para predecir el futuro con mayor precisión. La conjetura permite que el hardware precapture instrucciones 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 prevista no sólo se capta previamente sino que también se ejecuta antes de que se sepa si se debe tomar la rama o no. Esto puede producir un mejor rendimiento cuando la suposición es buena, con el riesgo de una penalización enorme cuando la suposición es mala porque es necesario deshacer las instrucciones.

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 aún 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 múltiples instrucciones simultáneamente. Esto es lo que logran los procesadores superescalares , al replicar unidades funcionales como las ALU. La replicación de unidades funcionales sólo fue posible cuando el área del troquel de un procesador de un solo modelo ya no superó los límites de lo que podía fabricarse de manera confiable. A finales de la década de 1980, los diseños superescalares comenzaron a entrar en el mercado.

En los diseños modernos es común encontrar dos unidades de carga, una tienda (muchas instrucciones no tienen resultados que 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 punto. Luego, los resultados se recopilan y reordenan al final.

Ejecución fuera de orden

La adición de cachés reduce la frecuencia o duración de las paradas debido a la espera de que se obtengan datos de la jerarquía de memoria, pero no elimina estas paradas por completo. En los primeros diseños, una falla 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én disponibles en la caché en ese momento. La ejecución fuera de orden permite que esa instrucción lista se procese mientras una instrucción más antigua espera en el caché y luego reordena los resultados para que parezca que todo sucedió en el orden programado. Esta técnica también se utiliza para evitar otros bloqueos 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.

Registrar 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 del programa debido a la reutilización de los mismos registros por esas instrucciones. Supongamos que tenemos dos grupos de instrucción que utilizarán el mismo registro . Primero se ejecuta un conjunto de instrucciones 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 multihilo

Los arquitectos informáticos se han visto obstaculizados por la creciente discrepancia entre 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 ocurrían cuando había que recuperar datos de la memoria principal. Además, el gran número de transistores y las altas frecuencias operativas necesarias para las técnicas 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 niveles más altos de paralelismo que existen fuera de un único programa o subproceso de programa .

Esta tendencia a veces se conoce como computación de rendimiento . Esta idea se originó en el mercado de mainframes, donde el procesamiento de transacciones en línea enfatizaba no sólo la velocidad de ejecución de una transacción, sino también la capacidad de manejar cantidades masivas de transacciones. Dado que las aplicaciones basadas en transacciones, como el enrutamiento de redes 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 para lograr este paralelismo es a través de sistemas multiprocesamiento , sistemas informáticos con múltiples CPU. Los servidores multiprocesadores de pequeña escala (2 a 8), que alguna vez estuvieron reservados para mainframes y supercomputadoras de alta gama , se han convertido en algo común para el mercado de las pequeñas empresas. Para las grandes corporaciones, los multiprocesadores de gran escala (16 a 256) son comunes. Desde los años 90 han aparecido incluso ordenadores personales con múltiples CPU.

Con mayores reducciones en el tamaño de los transistores gracias a los avances en la tecnología de semiconductores, han aparecido CPU multinúcleo en las que se implementan varias CPU en el mismo chip de silicio. Inicialmente se utilizó en chips destinados a mercados integrados, donde CPU más simples y más pequeñas permitirían que quepan múltiples instancias en una sola pieza de silicio. En 2005, la tecnología de semiconductores permitió fabricar en volumen chips CMP para CPU de escritorio duales de alta gama . Algunos diseños, como el UltraSPARC T1 de Sun Microsystems, han revertido a diseños más simples (escalar, en orden) para poder colocar más procesadores en una sola pieza de silicio.

Otra técnica que se ha vuelto más popular recientemente es el multiproceso . 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/hilo en particular, aumenta el rendimiento general del sistema al reducir el tiempo que la CPU está inactiva.

Conceptualmente, el subproceso múltiple equivale a un cambio de contexto a nivel del sistema operativo. La diferencia es que una CPU multiproceso puede realizar un cambio de subproceso 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 estado del hardware (como el archivo de registro y el contador del programa ) para cada subproceso activo.

Una mejora adicional es el subproceso múltiple simultáneo . Esta técnica permite que las CPU superescalares ejecuten instrucciones de diferentes programas/hilos simultáneamente en el mismo ciclo.

Ver también

Referencias

  1. ^ Directrices curriculares para programas de pregrado en ingeniería informática (PDF) . Asociación para Maquinaria de Computación. 2004. pág. 60. Archivado desde el original (PDF) el 3 de julio de 2017. Comentarios sobre la arquitectura y organización de computadoras: La arquitectura de computadoras 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...
  2. ^ Murdocca, millas; Heuring, Vicente (2007). Arquitectura y organización de computadoras, un enfoque integrado . Wiley. pag. 151.ISBN _ 9780471733881.
  3. ^ Clementes, Alan. Principios del hardware informático (4ª ed.). págs. 1–2.
  4. ^ Flynn, Michael J. (2007). "Introducción a la arquitectura y las máquinas". Arquitectura informática Diseño de procesadores canalizados y paralelos . Jones y Bartlett. págs. 1–3. ISBN 9780867202045.
  5. ^ ab Hennessy, John L .; Patterson, David A. (2006). Arquitectura informática: un enfoque cuantitativo (4ª ed.). Morgan Kaufman. ISBN 0-12-370490-1.
  6. ^ Wilkes, MV (1969). "El crecimiento del interés en la microprogramación: un estudio de la literatura". Encuestas de Computación ACM . 1 (3): 139–145. doi : 10.1145/356551.356553 . S2CID  10673679.

Otras lecturas