Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Tema 2. Arquitectura de CPU avanzadas. Juegos CISC y RISC. Proceso paralelo. Procesadores escalares y vectoriales. Segmentación. Caches multinivel. Índice Introducción.....................................................................................................................1 Procesadores CISC y RISC..............................................................................................2 Proceso paralelo...............................................................................................................4 Clasificación de Flynn de los sistemas paralelos.......................................................5 Proceso paralelo con multiprocesadores...................................................................5 Segmentación - PipeLine.................................................................................................6 Procesadores escalares y vectoriales...............................................................................8 Procesadores superescalares............................................................................................9 Memoria caché multi-nivel............................................................................................10 Niveles de caches........................................................................................................10 Cache unificad contra cache partida.......................................................................11 Introducción Desde la creación de los ordenadores, las prestaciones de los procesadores no han dejado de aumentar sin parar. Este rápido crecimiento ha sido debido a dos factores: • Los avances en la tecnología utilizada en la construcción del ordenador, y • Las innovaciones en el diseño de los mismos. Los avances tecnológicos han permitido disminuir los tiempos de conmutación de los transistores a base de hacerlos cada vez más pequeños e integrarlos en menor espacio. Por lo que los circuitos integrados que forman el ordenador pueden trabajar a mayor velocidad y aumenta el rendimiento del ordenador. Otro camino para obtener mejores prestaciones es modificar la organización interna del ordenador, es decir, su diseño. Gran parte de las mejoras obtenidas es gracias al uso del paralelismo, el aumento de los niveles de jerarquía de la memoria del ordenador añadiendo más niveles de memoria entre el procesador y la memoria principal y cambios en el diseño de los procesadores. Página 1 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Procesadores CISC y RISC En el diseño de procesadores hay dos tendencias enfrentadas, diseñar ordenadores que ejecutan un conjunto de instrucciones complejas -CISC, Complex Instruction Set Computers- o lo contrario, ordenadores con un juego de instrucciones simple y reducido -RISC Reduced Instruction Set Computer-. La tendencia histórica era diseñar procesadores cada vez más complejos y potentes, que pudieran ejecutar muchas instrucciones diferentes, con muchos operandos y muchos modos de direccionamiento. El objetivo de estos juegos de instrucciones complejos era: • Facilitar el desarrollo de compiladores eficientes • Mejorar la eficiencia de la ejecución, pues las instrucciones complejas se podían implementar por microcódigo. • Dar soporte a lenguajes de alto nivel más sotisficados. • Permitir la compatibilidad entre familias de mainframes de un mismo fabricante (Años 60 y 70) Los procesadores CISC se caracterizan por: • Necesitar varios ciclos de reloj para ejecutar una instrucción • Instrucciones Memoria-Memoria de tamaño variable • Un gran numero de instrucciones disponibles. • Tener una arquitectura compleja IBM, tras analizar y estudiar programas reales compilados, se dio cuenta que la mayoría de las instrucciones de un programa son sencillas (asignaciones, operaciones aritméticas básicas...) por lo que propusieron una arquitectura de procesador sencilla con muchos registros de propósito general. Los ordenadores RISC, que ejecutara eficientemente las instrucciones sencillas que son las más habituales, y las complejas las descompusiera el compilador en operaciones más sencillas. La finalidad es tener instrucciones fácilmente segmentables. Las características de los RISC son: • Un conjunto de instrucciones disponibles reducido y de la misma longitud. • Instrucciones sencillas del tipo registro-registro o memoria-registro • Instrucciones de acceso a memoria especiales (LOAD / STORE). Esto facilita un tratamiento específico de estas instrucciones por parte de la arquitectura y los compiladores. • Instrucciones fácilmente segmentables, por lo que se consigue finalizar una instrucción por ciclo de CPU. • Procesadores más sencillos, con unidades de control cableadas. Son más baratos de diseñar y fabricar. La descodificación de la instrucción es más rápida. El objetivo del diseño RISC es conseguir finalizar la ejecución de una instrucción cada ciclo de reloj. Página 2 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Ej: Diferencias entre una instrucción RISC y CISC: CISC RISC Add @100, @200, @300 Load @100, R1 Load @200,R2 Add R2, R1 Store R1, @300 No existe ningún estudio definitivo que demuestre la superioridad de los RISC frente a los CISC. Aunque es una realidad que la mayoría de los procesadores de los nuevos diseños son RISC o híbridos que incorporan características de RISC y CISC. Página 3 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Proceso paralelo El procesamiento paralelo se basa en procesar varias operaciones de forma simultánea en el mismo ordenador. El paralelismo se puede aplicar en varios niveles: • Paralelismo funcional. Consiste en tener en el procesador varias unidades de ejecución para poder ejecutar varias operaciones independientes de forma paralela. Tener varias unidades funcionales aumenta la complejidad del hardware, y su coste. Además surgen problemas como las dependencias entre instrucciones. Los procesadores superescalares entran dentro de este grupo. • Segmentación. La segmentación aprovecha que la ejecución de una instrucción pasa por varias fases, para crear unidades físicas independientes para cada fase. De esta forma en la misma unidad de ejecución se pueden tener varias instrucciones ejecutándose de forma simultánea pero en fases diferentes. • Procesamiento en Array. Consiste en tener varias unidades de ejecución bajo la supervisión de una misma unidad de control. De esta forma se puede ejecutar de forma paralela la misma función con datos diferentes. No confundir con los procesadores vectoriales, que se basan en la segmentación. • Multiprocesamiento. Consiste en tener en una misma máquina varios procesadores. Cada procesador ejecuta un proceso (programa independiente) de forma paralela. • Sistemas multitarea, existe un conjunto de procesos cargados en memoria, preparados para ejecutarse. En un sistema monoprocesador, sólo puede haber un proceso en ejecución en el procesador, y cuando éste efectúa una operación E/S, deja de ejecutarse en espera de que termine la operación de E/S y se ejecuta otro proceso. De esta forma, puede haber simultáneamente un proceso ejecutado por el procesador y varias tareas de E/S de procesos diferentes en los periféricos de E/S. Un concepto relacionado con el nivel de paralelismo es el de granularidad de las tareas paralelas. Un sistema con granularidad gruesa es aquel en que las operaciones que se ejecutan en paralelo son bastante gruesas, del orden de programas enteros. Un sistema con granularidad fina divide los programas en pequeñas partes, en algunos casos compuestas por unes pocas instrucciones. El paralelismo a nivel de multiprocesamiento es de granulidad gruesa, en cambio el paralelismo dentro de un procesador superescalar es de granularidad fina. Página 4 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Clasificación de Flynn de los sistemas paralelos Es una de las clasificaciones más famosas de los sistemas paralelos. Esta clasificación esta basada en la noción de flujos de información. Dos tipos de información entran en un procesador: datos e instrucciones. Conceptualmente, los dos flujos son independientes, aunque se almacenen juntos y se transmitan por los mismos canales. Flynn clasifica los ordenadores según tengan uno o más flujos. Esta clasificación da cuatro tipos de sistemas informáticos: • SISD (Single Instruction stream, Single Data Stream). Las máquinas convencionales monoprocesador son clasificadas como sistemas SISD. • SIMD (Single Instruction stream, Multiple Data Stream). Son máquinas que tienen una unidad de control y varias unidades de ejecución, que suelen tener su propia memoria. La unidad de ejecución carga y decodifica las instrucciones y envía las señales de control a todas la unidades de ejecución para que ejecuten la misma operación, aunque cada una con datos de su memoria. • MISD (Multiple Instruction stream, Single Data Stream). Estas máquinas ejecutan diferentes operaciones de forma simultánea sobre los mismos datos. Estás máquinas solo existen de forma experimental a no tener utilidad práctica. • MIMD (Multiple Instruction stream, Multiple Data Stream). Esta es la clasificación incluye sistemas informáticos de los más heterogéneos. Incluye todos los sistemas multiporcesador. Que explicaré a continuación. Proceso paralelo con multiprocesadores Uno de los métodos para mejorar el rendimiento de un ordenador es aumentar el número de procesadores de propósito general del sistema. Los sistemas de multiprocesadores se pueden dividir en: • Sistema fuertemente acoplados. Son los ordenadores donde los procesadores comparten una memoria común, los procesadores acceden a datos y programas comunes, y se comunican a través de la memoria. Estos sistemas a su vez se pueden subdividir en: Multiprocesadores simétricos (SMP). Los procesadores comparten una misma memoria común y dispositivos de E/S y el tiempo de acceso a memoria es aproximadamente el mismo para todos los procesadores. Todos los procesadores pueden realizar las mismas funciones, de hay lo de simétricos y están gobernados por un SO común. Los SMP tienen las siguientes ventajas potenciales respecto los monoprocesadores: o Prestaciones. Si un trabajo se puede dividir en partes que se pueden realizar en paralelo, un sistema SMP proporcionará mejores prestaciones. o Disponibilidad: Como todos los procesadores pueden realizar las mismas funciones, un fallo de procesador no hará que el computador se detenga. o Escalado: Se puede incrementar la potencia del sistema añadiendo más procesadores. Página 5 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 El acceso a memoria puede ser a través de un bus común, este sistema de acceso es el más simple, pero el bus se puede convertir un cuello de botella que reduzca las prestaciones del sistema. Para solucionarlo, estos sistemas se utilizan sistemas de caché multinivel. Otro sistema para acceder a memoria es utilizar sistema de memoria multipuerto que permite el acceso directo e independiente a los módulos de memoria por parte de los procesadores y dispositivos. Este método consigue prestaciones mejores pero obliga a tener memorias más complejas con mucho más lógica para controlar los accesos concurrentes a los mismos datos, por lo que es más cara. Sistemas NUMA (Non Uniforme Memory Access): Son sistemas donde el tiempo de acceso a la memoria no es uniforme para todos las direcciones de memoria. Los procesadores acceden más rápido a los módulos de memoria que tienen más cercanos. La ubicación de los datos en un módulo u otro afecta directamente al rendimiento de los procesos. • Sistemas débilmente acoplados: Sistemas de memoria distribuida. Son sistemas donde existe una unidad de control y varias unidades de ejecución con su memoria dedicada. Estos sistemas no se utilizan dado el alto ratio coste/prestaciones. Una evolución de estos sistemas que si que tienen una buena cuota de mercado son los clusters. Existen también los procesadores multi-núcleo, en los cuales se combina dos o más núcleos (Unidad de control y unidades de ejecución) independientes en un solo paquete, a menudo un solo circuito integrado. Actúan como si cada núcleo fuera un procesador independiente, aunque tienen la limitación de usar el mismo acceso a la memoria principal. Los sistemas de procesador multinúcleo tienen menor rendimiento que un sistema de varios procesadores independientes, aunque se usan porque su coste es menor. Segmentación - PipeLine Aprovecha que la ejecución de una instrucción pasa por varias fases, para crear unidades físicas independientes para cada fase. El ciclo de una instrucción se puede dividir, por ejemplo, en carga de la instrucción, decodificación, carga de los operandos, ejecución de la operación y guardar los resultados. De esta forma en la misma unidad de ejecución se pueden tener varias instrucciones ejecutándose de forma simultánea pero en fases diferentes del ciclo de instrucción. El número de instrucciones simultaneas ejecutándose puede ser como máximo el número de etapas del pipe-line. Instrucción 1 Fetch Instrucción 2 Decode Instrucción 3 Fetch operandos El pipeline se sincroniza con el reloj del procesador. La división por etapas debe hacerse de forma que todas las etapas tarden un tiempo similar, pues el ciclo del procesador dependerá del tiempo que tarda la etapa más lenta. Los principios de segmentación Página 6 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 también se aplican a las ALU para poder tener operaciones segmentadas y tener una pipe-line con más etapas y un ciclo de CPU menor. La segmentación no mejora la velocidad de ejecución individual de una instrucción, sino que la empeora, pero mejora la velocidad de ejecución global del procesador. Un procesador en ejecución durante un tiempo, termina la ejecución de una instrucción casi cada ciclo. Un problema para la segmentación es el acceso a memoria, que suele ser mucho más lento que una fase del pipeline. Por ello, los procesadores segmentados son usados en procesadores con muchos registros en el procesador, para evitar tener que acceder constantemente a memoria. Dependencias Los problemas que tiene la segmentación, que reducen el rendimiento del procesador son las dependencias entre instrucciones. Ocurre cuando dos instrucciones compiten por un mismo recurso, generalmente un registro. Por ejemplo: I: R1 = R2 + R3 I + 1: R4 = R1 + R5 La segunda instrucción utiliza como operando el resultado de la primera, por lo que tendrá que esperar a que finalice. Esto provoca que se pierdan ciclos de CPU. Estos ciclos perdidos se conocen como “burbujas”. Además de las dependencias de datos, existe la dependencia de control, que se produce por instrucciones de salto. El pipeline comienza a ejecutar instrucciones, que luego por un salto, se tienen que descartar, provocando la perdida de ciclos de CPU. Existen técnicas para reducir el número de ciclos perdidos, pero no se pueden reducir a cero. Para reducir los problemas de las dependencias de control el procesador realice un “predicción de salto”, para hacer efectivo el salto o no, según sea lo más probable. Para reducir las dependencias de datos hay básicamente dos soluciones: • Reordenación de código por parte de un compilador. A la hora de generar el código máquina, el compilador organiza el código de forma que se reducen la perdida de ciclos, manteniendo la misma funcionalidad del algoritmo. • Uso de hardware especializado, capaz de detectar las dependencias y activar los ‘adelantamientos’ o ‘atajo’. Un adelantamiento es una conexión entre dos fases de una pipeline para un dato recién calculado puede ser utilizado por otra instrucción sin esperar que la otra instrucción finalice. Por ejemplo, establecer una conexión entre el registro acumulador de la ALU y las entradas de la misma ALU, para poder aprovechar utilizar el resultado de una operación como operando en el siguiente ciclo. Página 7 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Procesadores escalares y vectoriales Los procesadores escalares son los diseñados para realizar cálculos con operandos atómicos. Por ejemplo una instrucción escalar sería suma 3 + 2, donde el 3 y el 2 son valores atómicos. Los procesadores escalares son de propósito general pues sirven para realizar cualquier cálculo, pues las operaciones con valores no escalares se pueden descomponer en operaciones con valores escalares. Los procesadores escalares tienen un bajo rendimiento para ciertos tipos de problemas matemáticos y de ingeniería donde los problemas se resuelven con operaciones matriciales y vectoriales. Por ejemplo para multiplicar un vector de 64 elementos por un escalar, un procesador escalar deberá hacer 64 operaciones dentro de un bucle. Claramente se observa que esta operación se puede realizar de forma paralela para cada uno de los elementos del vector. Un procesador vectorial podría realizar la operación sobre los vectores en una sola instrucción sin necesidad de bucles. Ventajas del procesamiento vectorial: • Permiten una gran segmentación pues los cálculos con cada elementos del vector suelen ser independientes. • Cada instrucción vectorial equivale a un bucle, con los procesadores vectorial se evita tener que controlar el bucle. • Las instrucciones vectorial que acceden a memoria tienen un patrón de acceso predecible. Se puede organizar los datos en memoria entrelazadas para obtener un buen rendimiento de acceso a los datos. Características específicas de los máquinas vectoriales. • Instrucciones especiales para operar vectores, incluidas dentro del juego de instrucciones del procesador. • Registros separados para vectores y para escalares. Los procesadores vectoriales suelen tener un registro especial para indicar el número de elementos que componen el vector. • Ejecución de las operaciones a través de segmentación, no hay varias unidades de ejecución paralelas. • Necesidad de sistemas de memoria con un gran ancho de banda. Clasificación de los procesadores vectoriales En las operaciones vectoriales la CPU deben ser capaz de leer dos operandos y guardar un resultado en cada ciclo de reloj. Las memorias convencionales no pueden soportar este ancho de banda, pues sólo pueden realizar una operación por ciclo. Por ello, las máquinas vectoriales tienen sistemas de memoria más complejos, que sirven para clasificarlos: • Arquitecturas vectoriales memoria-memoria: Los operandos para las instrucciones se cargan directamente de la memoria principal. Utilizan memorias multipuerto para soportar el acceso concurrente a datos. Los sistemas de memoria con acceso concurrente a varios datos son muy costosos. Página 8 de 11 Tema 2. Arquitectura de CPU avanzadas • 15/03/2011 Arquitecturas vectoriales con registros: Los operandos son cargados previamente sobre un conjunto de registros vectoriales, cada uno de los cuales puede almacenar una parte del vector, por ejemplo 64 elementos. Las operaciones se realizan cogiendo los elementos del registro vectorial y almacenándolos en otro registro vectorial. La ventaja de las arquitecturas memoria-memoria es que pueden operar con vectores de cualquier tamaño. En cambio las arquitecturas registro-registro deben dividir el vector en fragmentos que quepan en los vectores. La arquitectura reg-reg tiene un mejor rendimiento cuando se realizan múltiples usos de los operandos transferidos a los registros. Procesadores superescalares Son procesadores escalares capaces de ejecutar varias instrucciones secuenciales de forma simultánea en cada ciclo. Para ello, el procesador dispone de varias unidades de ejecución independientes. Cada unidad de ejecución tiene su propia unidad de control y existe una UC principal que las coordina. Al procesador se le añade una unidad de recogida de instrucciones, que lee varias instrucciones de un proceso y las analiza para detectar las dependencias entre ellas. Reordena las instrucciones de forma que se reduzcan las dependencias y poder ejecutarlas de forma simultánea. A la hora de almacenar los resultados de las operaciones, se vuelven a la orden inicial del programa. Para reducir las dependencias de datos entre instrucciones en unidades de ejecución independiente, se aplican técnicas como el renombre de registros. En la mayoría de sistemas, la arquitectura de alto nivel, como el juego de instrucciones, no se ha modificado desde los diseños escalares anteriores. Sencillamente, los diseños superescalares aprovechan el paralelismo a nivel de instrucción para mejorar el rendimiento de estas arquitecturas. Ejemplo: La arquitectura X86. Página 9 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Memoria caché multi-nivel La memoria cache se sitúa entre el microprocesador y la memoria principal. Se utiliza para almacenar una copia de los datos de la principal que se utilizan frecuentemente. Esta memoria permite agilizar el trabajo del microprocesador pues trabaja casi a su misma velocidad. Es una memoria que es invisible a los programas que se ejecutan. Cuando se introdujeron originalmente las caches, un sistema normalmente sólo tenía una caché. Más recientemente, se ha convertido en una norma el uso de múltiples caches. Hay dos aspectos de diseño relacionados con este tema, que son: el número de niveles de caché y el uso de caché unificada frente a partida. Niveles de caches Con el aumento de la densidad de integración, ha sido posible tener una caché en el mismo chip del procesador: caché “on-chip”, además de la caché exterior “off-chip”. La caché on-chip reduce la actividad del bus externo del procesador (que conecta e procesador con la caché externa) por lo que reduce los tiempos de acceso y aumenta las prestaciones del sistema. El tiempo de acceso a datos internos del procesador es muy corto en comparación que los accesos a caches “off-chip” y además deja el bus libre para realizar otras operaciones. La inclusión de una caché “on-chip” deja abierta la cuestión si es deseable tener una caché externa. La respuesta es afirmativa, por el principio de localidad temporal y espacial de las referencias a memoria de los programas durante su ejecución. Por ello, los diseños actuales incorporan ambas cachés. La estructura resultante se denomina caché dos niveles, el nivel 1 (L1) es la caché interna y la externa el nivel 2 (L2). La memoria de nivel 1 es de menor capacidad que la de nivel 2. El funcionamiento de las memorias caché multinivel es similar que la de un solo nivel. Cuando el procesador accede a una palabra de memoria, si esta en caché L1 accede a esa memoria, sino la caché L1 lo solita a la caché L2, si esta tampoco lo tiene solicita el bloque de memoria con la palabra a la memoria principal. En los sistemas con varios procesadores, la memoria de nivel L2 puede estar compartida o puede aparecer un nivel más de caché L3. Las cachés con post-escritura en sistema con varios procesadores pueden provocar problemas de coherencia de datos, un procesador modifica un dato en su memoria cache de nivel 1 y al ser un sistema postescritura, otro procesador que lea el dato de la memoria principal obtendrá un dato erróneo. Los problemas de coherencia se solucionan con el protocolo MESI. Página 10 de 11 Tema 2. Arquitectura de CPU avanzadas 15/03/2011 Cache unificad contra cache partida En los primeros diseños de caches multinivel, la cache de nivel 1 contiene tanto las referencias a datos como instrucciones. Más recientemente se hecho normal separar los datos y las instrucciones en dos caches separadas. La cache unificada tiene varias ventajas potenciales: • Para un mismo tamaño de memoria, una cache unificada tiene más tasa de aciertos que una divida, ya que nivela automáticamente la carga entre la captación de instrucciones y datos. Es decir, si un patrón de acceso solicita muchos más datos que instrucciones en la caché unificada se reservará más espacio para datos, cosa que en una dividida no se puede. • Sólo se necesita diseñar e implementar una caché, por lo que es más barato. La caché dividida se utiliza porque los procesadores actuales son superescalares con ejecución segmentada de instrucciones. Un procesador superescalar llena un buffer con las instrucciones que va ejecutar y las reordena y a la vez las unidades de ejecución solicitan datos. Si se tiene un caché unificada, puede que en un momento dado puede que se solicitud de instrucciones para ejecutar deba esperar porque la caché está atendiendo una solicitud de datos. Esta disputa por la caché degrada el rendimiento del procesador, para evitarlo se tienen caches divididas. Página 11 de 11