Unidad Central de procesamiento

Compartir Imprimir Citar
Componente central de computadora que ejecuta instrucciones
Una CPU Intel 80486DX2, como se ve desde arriba
Parte inferior de un Intel 80486DX2, mostrando sus pines

Una unidad central de procesamiento (CPU), también llamada procesador central, procesador principal o simplemente procesador, es el circuito electrónico que ejecuta instrucciones que integran un programa informático. La CPU realiza operaciones básicas de aritmética, lógica, control y entrada/salida (E/S) especificadas por las instrucciones del programa. Esto contrasta con los componentes externos, como la memoria principal y los circuitos de E/S, y los procesadores especializados, como las unidades de procesamiento de gráficos (GPU).

La forma, el diseño y la implementación de las CPU han cambiado con el tiempo, pero su funcionamiento fundamental permanece casi sin cambios. Los componentes principales de una CPU incluyen la unidad aritmético-lógica (ALU) que realiza operaciones aritméticas y lógicas, los registros del procesador que suministran operandos a la ALU y almacenan los resultados de las operaciones de la ALU, y una unidad de control que organiza la obtención (desde la memoria), decodificación y ejecución (de instrucciones) dirigiendo las operaciones coordinadas de la ALU, los registros y otros componentes.

La mayoría de las CPU modernas se implementan en microprocesadores de circuitos integrados (IC), con una o más CPU en un único chip IC. Los chips de microprocesador con varias CPU son procesadores de varios núcleos. Las CPU físicas individuales, núcleos de procesador, también se pueden subprocesos múltiples para crear CPU virtuales o lógicas adicionales.

Un IC que contiene una CPU también puede contener memoria, interfaces periféricas y otros componentes de una computadora; estos dispositivos integrados se denominan microcontroladores o sistemas en un chip (SoC).

Los procesadores de matriz o los procesadores vectoriales tienen varios procesadores que funcionan en paralelo, sin que ninguna unidad se considere central. Las CPU virtuales son una abstracción de recursos computacionales agregados dinámicos.

Historia

EDVAC, uno de los primeros ordenadores de programas almacenados

Las primeras computadoras, como la ENIAC, tenían que volver a cablearse físicamente para realizar diferentes tareas, lo que hizo que estas máquinas se llamaran "computadoras de programa fijo". La "unidad central de procesamiento" El término ha estado en uso desde 1955. Desde el término "CPU" se define generalmente como un dispositivo para la ejecución de software (programa de computadora), los primeros dispositivos que correctamente podrían llamarse CPU llegaron con la llegada de la computadora de programa almacenado.

La idea de una computadora con programa almacenado ya había estado presente en el diseño de ENIAC de J. Presper Eckert y John William Mauchly, pero inicialmente se omitió para que pudiera terminarse antes. El 30 de junio de 1945, antes de que se hiciera ENIAC, el matemático John von Neumann distribuyó el documento titulado Primer borrador de un informe sobre el EDVAC. Era el esquema de una computadora con programa almacenado que finalmente se completaría en agosto de 1949. EDVAC fue diseñado para realizar una cierta cantidad de instrucciones (u operaciones) de varios tipos. Significativamente, los programas escritos para EDVAC debían almacenarse en la memoria de una computadora de alta velocidad en lugar de especificarse por el cableado físico de la computadora. Esto superó una limitación severa de ENIAC, que era el tiempo y el esfuerzo considerables necesarios para reconfigurar la computadora para realizar una nueva tarea. Con el diseño de von Neumann, el programa que ejecutaba EDVAC podía cambiarse simplemente cambiando el contenido de la memoria. EDVAC, no fue la primera computadora con programa almacenado, Manchester Baby, que era una computadora con programa almacenado experimental a pequeña escala, ejecutó su primer programa el 21 de junio de 1948 y Manchester Mark 1 ejecutó su primer programa durante la noche del 16 al 17. junio de 1949.

Las primeras CPU eran diseños personalizados que se usaban como parte de una computadora más grande y, a veces, distintiva. Sin embargo, este método de diseñar CPU personalizadas para una aplicación en particular ha dado paso en gran medida al desarrollo de procesadores multipropósito producidos en grandes cantidades. Esta estandarización comenzó en la era de los mainframes y minicomputadoras de transistores discretos y se aceleró rápidamente con la popularización del circuito integrado (IC). El IC ha permitido diseñar y fabricar CPU cada vez más complejas con tolerancias del orden de los nanómetros. Tanto la miniaturización como la estandarización de las CPU han aumentado la presencia de dispositivos digitales en la vida moderna mucho más allá de la aplicación limitada de máquinas informáticas dedicadas. Los microprocesadores modernos aparecen en dispositivos electrónicos que van desde automóviles hasta teléfonos celulares y, a veces, incluso en juguetes.

Si bien a von Neumann se le atribuye con mayor frecuencia el diseño de la computadora con programa almacenado debido a su diseño de EDVAC, y el diseño se conoció como la arquitectura de von Neumann, otros antes que él, como Konrad Zuse, sugirieron e implementaron ideas similares La llamada arquitectura Harvard del Harvard Mark I, que se completó antes de EDVAC, también utilizó un diseño de programa almacenado utilizando cinta de papel perforada en lugar de memoria electrónica. La diferencia clave entre las arquitecturas de von Neumann y Harvard es que la última separa el almacenamiento y el tratamiento de las instrucciones y los datos de la CPU, mientras que la primera utiliza el mismo espacio de memoria para ambas. La mayoría de las CPU modernas tienen principalmente un diseño de von Neumann, pero también se ven CPU con la arquitectura Harvard, especialmente en aplicaciones integradas; por ejemplo, los microcontroladores Atmel AVR son procesadores de arquitectura Harvard.

Los relés y los tubos de vacío (tubos termoiónicos) se usaban comúnmente como elementos de conmutación; una computadora útil requiere miles o decenas de miles de dispositivos de conmutación. La velocidad general de un sistema depende de la velocidad de los interruptores. Las computadoras de tubo de vacío como EDVAC tendían a promediar ocho horas entre fallas, mientras que las computadoras de relé como la (más lenta, pero anterior) Harvard Mark I fallaban muy raramente. Al final, las CPU basadas en tubos se volvieron dominantes porque las importantes ventajas de velocidad que ofrecían generalmente superaban los problemas de confiabilidad. La mayoría de estas primeras CPU sincrónicas funcionaban a velocidades de reloj bajas en comparación con los diseños microelectrónicos modernos. Las frecuencias de la señal del reloj que iban desde los 100 kHz hasta los 4 MHz eran muy comunes en ese momento, limitadas en gran medida por la velocidad de los dispositivos de conmutación con los que se construyeron.

CPU de transistores

Procesador IBM PowerPC 604e

La complejidad del diseño de las CPU aumentó a medida que varias tecnologías facilitaban la construcción de dispositivos electrónicos más pequeños y confiables. La primera mejora de este tipo se produjo con la llegada del transistor. Las CPU transistorizadas durante las décadas de 1950 y 1960 ya no tenían que construirse con elementos de conmutación voluminosos, poco confiables y frágiles, como válvulas de vacío y relés. Con esta mejora, se construyeron CPU más complejas y confiables en una o varias placas de circuito impreso que contenían componentes discretos (individuales).

En 1964, IBM presentó su arquitectura de computadora IBM System/360 que se utilizó en una serie de computadoras capaces de ejecutar los mismos programas con diferente velocidad y rendimiento. Esto fue significativo en un momento en que la mayoría de las computadoras electrónicas eran incompatibles entre sí, incluso las del mismo fabricante. Para facilitar esta mejora, IBM utilizó el concepto de un microprograma (a menudo llamado "microcódigo"), que aún tiene un uso generalizado en las CPU modernas. La arquitectura System/360 fue tan popular que dominó el mercado de las computadoras centrales durante décadas y dejó un legado que aún continúa en computadoras modernas similares como la serie z de IBM. En 1965, Digital Equipment Corporation (DEC) introdujo otra computadora influyente dirigida a los mercados científicos y de investigación, la PDP-8.

Tablero Fujitsu con procesadores SPARC64 VIIIfx

Las computadoras basadas en transistores tenían varias ventajas distintas sobre sus predecesoras. Además de facilitar una mayor confiabilidad y un menor consumo de energía, los transistores también permitieron que las CPU funcionaran a velocidades mucho más altas debido al breve tiempo de conmutación de un transistor en comparación con un tubo o un relé. La mayor confiabilidad y el aumento espectacular de la velocidad de los elementos de conmutación (que en ese momento eran casi exclusivamente transistores); Las velocidades de reloj de la CPU en decenas de megahercios se obtuvieron fácilmente durante este período. Además, mientras que los transistores discretos y las CPU IC tenían un uso intensivo, comenzaron a aparecer nuevos diseños de alto rendimiento como una sola instrucción, procesadores vectoriales de múltiples datos (SIMD). Estos primeros diseños experimentales dieron lugar más tarde a la era de las supercomputadoras especializadas como las fabricadas por Cray Inc y Fujitsu Ltd.

CPU de integración a pequeña escala

CPU, memoria básica e interfaz de bus externo de un DEC PDP-8/I, hecho de circuitos integrados a mediana escala

Durante este período, se desarrolló un método para fabricar muchos transistores interconectados en un espacio compacto. El circuito integrado (IC) permitió fabricar una gran cantidad de transistores en un solo troquel basado en semiconductores, o 'chip'. Al principio, solo los circuitos digitales no especializados muy básicos, como las puertas NOR, se miniaturizaron en circuitos integrados. CPU basadas en estos "bloques de construcción" Los circuitos integrados se conocen generalmente como "integración a pequeña escala" (SSI) dispositivos. Los circuitos integrados SSI, como los que se utilizan en la computadora de guía Apollo, generalmente contenían hasta unas pocas docenas de transistores. Construir una CPU completa a partir de circuitos integrados SSI requería miles de chips individuales, pero aun así consumía mucho menos espacio y energía que los diseños de transistores discretos anteriores.

El System/370 de IBM, continuación del System/360, utilizaba circuitos integrados SSI en lugar de módulos de transistores discretos de Solid Logic Technology. Los PDP-8/I y KI10 PDP-10 de DEC también cambiaron los transistores individuales utilizados por el PDP-8 y el PDP-10 a los circuitos integrados SSI, y su extremadamente popular línea PDP-11 se construyó originalmente con circuitos integrados SSI pero finalmente se implementó con componentes LSI una vez que estos se volvieron prácticos.

CPU de integración a gran escala

Lee Boysel publicó artículos influyentes, incluido un "manifiesto" de 1967, que describía cómo construir el equivalente de una computadora central de 32 bits a partir de una cantidad relativamente pequeña de circuitos de integración a gran escala (LSI). La única forma de construir chips LSI, que son chips con cien o más puertas, era construirlos utilizando un proceso de fabricación de semiconductores de metal-óxido-semiconductor (MOS) (ya sea lógica PMOS, lógica NMOS o lógica CMOS). Sin embargo, algunas compañías continuaron construyendo procesadores a partir de chips de lógica de transistor-transistor bipolar (TTL) porque los transistores de unión bipolar eran más rápidos que los chips MOS hasta la década de 1970 (algunas compañías como Datapoint continuaron construyendo procesadores a partir de chips TTL hasta principios de la década de 1970). 1980). En la década de 1960, los circuitos integrados de MOS eran más lentos e inicialmente se consideraban útiles solo en aplicaciones que requerían poca potencia. Tras el desarrollo de la tecnología MOS de puerta de silicio por parte de Federico Faggin en Fairchild Semiconductor en 1968, los circuitos integrados MOS reemplazaron en gran medida al TTL bipolar como la tecnología de chip estándar a principios de la década de 1970.

A medida que avanzaba la tecnología microelectrónica, se colocó una cantidad cada vez mayor de transistores en los circuitos integrados, lo que disminuyó la cantidad de circuitos integrados individuales necesarios para una CPU completa. Los circuitos integrados MSI y LSI aumentaron el número de transistores a cientos y luego a miles. Para 1968, la cantidad de circuitos integrados necesarios para construir una CPU completa se había reducido a 24 circuitos integrados de ocho tipos diferentes, y cada circuito integrado contenía aproximadamente 1000 MOSFET. En marcado contraste con sus predecesores SSI y MSI, la primera implementación LSI del PDP-11 contenía una CPU compuesta por solo cuatro circuitos integrados LSI.

Microprocesadores

Morir de un microprocesador Intel 80486DX2 (tamaño real: 12 × 6.75 mm) en su embalaje
Intel Core i5 CPU en un Vaio E serie portátil placa madre (a la derecha, debajo de la tubería de calor)
Dentro de un portátil, con la CPU eliminada de la toma

Desde que se introdujeron por primera vez, los microprocesadores han superado casi por completo a todos los demás métodos de implementación de unidades de procesamiento central. El primer microprocesador disponible comercialmente, fabricado en 1971, fue el Intel 4004, y el primer microprocesador ampliamente utilizado, fabricado en 1974, fue el Intel 8080. Los fabricantes de mainframe y minicomputadoras de la época lanzaron programas de desarrollo de IC patentados para actualizar sus arquitecturas de computadoras más antiguas, y finalmente produjo microprocesadores compatibles con conjuntos de instrucciones que eran compatibles con versiones anteriores de su hardware y software más antiguos. Combinado con el advenimiento y eventual éxito de la omnipresente computadora personal, el término CPU ahora se aplica casi exclusivamente a los microprocesadores. Se pueden combinar varias CPU (indicadas como núcleos) en un solo chip de procesamiento.

Las generaciones anteriores de CPU se implementaron como componentes discretos y numerosos pequeños circuitos integrados (IC) en una o más placas de circuito. Los microprocesadores, por otro lado, son CPU fabricados en una cantidad muy pequeña de circuitos integrados; normalmente solo uno. El tamaño de CPU más pequeño en general, como resultado de su implementación en un solo troquel, significa un tiempo de conmutación más rápido debido a factores físicos como la disminución de la capacitancia parásita de la puerta. Esto ha permitido que los microprocesadores síncronos tengan velocidades de reloj que van desde decenas de megahercios hasta varios gigahercios. Además, la capacidad de construir transistores extremadamente pequeños en un IC ha aumentado la complejidad y el número de transistores en una sola CPU muchas veces. Esta tendencia ampliamente observada se describe mediante la ley de Moore, que demostró ser un predictor bastante preciso del crecimiento de la complejidad de la CPU (y otros circuitos integrados) hasta 2016.

Si bien la complejidad, el tamaño, la construcción y la forma general de las CPU han cambiado enormemente desde 1950, el diseño y la función básicos no han cambiado mucho. Casi todas las CPU comunes hoy en día pueden describirse con mucha precisión como máquinas de programa almacenado de von Neumann. Como la ley de Moore ya no se cumple, han surgido preocupaciones sobre los límites de la tecnología de transistores de circuitos integrados. La miniaturización extrema de las puertas electrónicas está provocando que los efectos de fenómenos como la electromigración y la fuga por debajo del umbral se vuelvan mucho más significativos. Estas nuevas preocupaciones se encuentran entre los muchos factores que llevan a los investigadores a investigar nuevos métodos de computación, como la computadora cuántica, así como a expandir el uso del paralelismo y otros métodos que amplían la utilidad del modelo clásico de von Neumann.

Operación

La operación fundamental de la mayoría de las CPU, independientemente de la forma física que adopten, es ejecutar una secuencia de instrucciones almacenadas que se denomina programa. Las instrucciones a ejecutar se guardan en algún tipo de memoria de computadora. Casi todas las CPU siguen los pasos de búsqueda, decodificación y ejecución en su operación, que se conocen colectivamente como el ciclo de instrucción.

Después de la ejecución de una instrucción, todo el proceso se repite, con el siguiente ciclo de instrucción normalmente obteniendo la siguiente instrucción en secuencia debido al valor incrementado en el contador del programa. Si se ejecutó una instrucción de salto, el contador del programa se modificará para contener la dirección de la instrucción a la que se saltó y la ejecución del programa continúa normalmente. En CPU más complejas, se pueden obtener, decodificar y ejecutar varias instrucciones simultáneamente. En esta sección, se describe lo que generalmente se conoce como la "tubería RISC clásica", que es bastante común entre las CPU simples que se usan en muchos dispositivos electrónicos (a menudo llamados microcontroladores). Ignora en gran medida el importante papel de la memoria caché de la CPU y, por lo tanto, la etapa de acceso de la canalización.

Algunas instrucciones manipulan el contador del programa en lugar de producir datos de resultados directamente; tales instrucciones generalmente se denominan "saltos" y facilitar el comportamiento del programa como los bucles, la ejecución condicional del programa (mediante el uso de un salto condicional) y la existencia de funciones. En algunos procesadores, algunas otras instrucciones cambian el estado de los bits en un "flags" Registrarse. Estas banderas se pueden usar para influir en el comportamiento de un programa, ya que a menudo indican el resultado de varias operaciones. Por ejemplo, en dichos procesadores, un "comparar" la instrucción evalúa dos valores y establece o borra bits en el registro de banderas para indicar cuál es mayor o si son iguales; una de estas banderas podría ser utilizada por una instrucción de salto posterior para determinar el flujo del programa.

Buscar

Fetch implica recuperar una instrucción (representada por un número o una secuencia de números) de la memoria del programa. La ubicación de la instrucción (dirección) en la memoria del programa está determinada por el contador del programa (PC; llamado 'puntero de instrucción' en los microprocesadores Intel x86), que almacena un número que identifica la dirección de la siguiente instrucción a buscar. Después de obtener una instrucción, la PC se incrementa por la longitud de la instrucción para que contenga la dirección de la siguiente instrucción en la secuencia. A menudo, la instrucción que se va a buscar debe recuperarse de una memoria relativamente lenta, lo que hace que la CPU se detenga mientras espera que se devuelva la instrucción. Este problema se aborda en gran medida en los procesadores modernos mediante cachés y arquitecturas de canalización (ver más abajo).

Decodificar

La instrucción que la CPU extrae de la memoria determina lo que hará la CPU. En el paso de decodificación, realizado por un circuito decodificador binario conocido como decodificador de instrucciones, la instrucción se convierte en señales que controlan otras partes de la CPU.

La forma en que se interpreta la instrucción está definida por la arquitectura del conjunto de instrucciones (ISA) de la CPU. A menudo, un grupo de bits (es decir, un "campo") dentro de la instrucción, llamado código de operación, indica qué operación se realizará, mientras que los campos restantes generalmente brindan información complementaria requerida para la operación, como como operandos. Esos operandos pueden especificarse como un valor constante (llamado valor inmediato) o como la ubicación de un valor que puede ser un registro del procesador o una dirección de memoria, según lo determine algún modo de direccionamiento.

En algunos diseños de CPU, el decodificador de instrucciones se implementa como un circuito decodificador binario cableado e inalterable. En otros, se utiliza un microprograma para traducir las instrucciones en conjuntos de señales de configuración de la CPU que se aplican secuencialmente sobre múltiples pulsos de reloj. En algunos casos, la memoria que almacena el microprograma es reescribible, lo que permite cambiar la forma en que la CPU decodifica las instrucciones.

Ejecutar

Después de los pasos de obtención y decodificación, se realiza el paso de ejecución. Dependiendo de la arquitectura de la CPU, esto puede consistir en una sola acción o una secuencia de acciones. Durante cada acción, las señales de control activan o desactivan eléctricamente varias partes de la CPU para que puedan realizar la totalidad o parte de la operación deseada. Luego, la acción se completa, generalmente en respuesta a un pulso de reloj. Muy a menudo, los resultados se escriben en un registro interno de la CPU para un acceso rápido por parte de instrucciones posteriores. En otros casos, los resultados pueden escribirse en una memoria principal más lenta, pero menos costosa y de mayor capacidad.

Por ejemplo, si se va a ejecutar una instrucción de suma, se activan los registros que contienen operandos (números que se suman), al igual que las partes de la unidad aritmética lógica (ALU) que realizan la suma. Cuando se produce el pulso de reloj, los operandos fluyen desde los registros de origen hacia la ALU y la suma aparece en su salida. En pulsos de reloj subsiguientes, otros componentes se habilitan (y deshabilitan) para mover la salida (la suma de la operación) al almacenamiento (por ejemplo, un registro o memoria). Si la suma resultante es demasiado grande (es decir, es mayor que el tamaño de la palabra de salida de la ALU), se establecerá un indicador de desbordamiento aritmético, lo que influirá en la siguiente operación.

Estructura e implementación

Diagrama de bloque de uniprocessor-CPU básico. Las líneas negras indican flujo de datos, mientras que las líneas rojas indican flujo de control; las flechas indican direcciones de flujo.

Conectado a la circuitería de una CPU hay un conjunto de operaciones básicas que puede realizar, denominado conjunto de instrucciones. Tales operaciones pueden implicar, por ejemplo, sumar o restar dos números, comparar dos números o saltar a una parte diferente de un programa. Cada instrucción está representada por una combinación única de bits, conocida como código de operación de lenguaje de máquina. Mientras procesa una instrucción, la CPU decodifica el código de operación (a través de un decodificador binario) en señales de control, que orquestan el comportamiento de la CPU. Una instrucción completa en lenguaje de máquina consta de un código de operación y, en muchos casos, bits adicionales que especifican argumentos para la operación (por ejemplo, los números que se suman en el caso de una operación de suma). Subiendo en la escala de complejidad, un programa en lenguaje de máquina es una colección de instrucciones en lenguaje de máquina que ejecuta la CPU.

La operación matemática real para cada instrucción la realiza un circuito lógico combinacional dentro del procesador de la CPU conocido como unidad aritmético-lógica o ALU. En general, una CPU ejecuta una instrucción extrayéndola de la memoria, usando su ALU para realizar una operación y luego almacenando el resultado en la memoria. Además de las instrucciones para matemáticas enteras y operaciones lógicas, existen otras instrucciones de máquina, como aquellas para cargar datos de la memoria y almacenarlos de nuevo, operaciones de bifurcación y operaciones matemáticas en números de punto flotante realizadas por el sistema flotante de la CPU. unidad de punto (FPU).

Unidad de control

La unidad de control (CU) es un componente de la CPU que dirige el funcionamiento del procesador. Le dice a la memoria de la computadora, a la unidad aritmética y lógica y a los dispositivos de entrada y salida cómo responder a las instrucciones que se han enviado al procesador.

Dirige el funcionamiento de las otras unidades proporcionando señales de tiempo y control. La mayoría de los recursos informáticos son gestionados por la CU. Dirige el flujo de datos entre la CPU y los otros dispositivos. John von Neumann incluyó la unidad de control como parte de la arquitectura de von Neumann. En los diseños de computadoras modernas, la unidad de control suele ser una parte interna de la CPU y su función y funcionamiento generales no han cambiado desde su introducción.

Unidad aritmética lógica

Representación simbólica de un ALU y sus señales de entrada y salida

La unidad aritmética lógica (ALU) es un circuito digital dentro del procesador que realiza operaciones aritméticas enteras y lógicas bit a bit. Las entradas a la ALU son las palabras de datos con las que se operará (llamados operandos), información de estado de operaciones anteriores y un código de la unidad de control que indica qué operación realizar. Según la instrucción que se ejecute, los operandos pueden provenir de registros internos de la CPU, memoria externa o constantes generadas por la propia ALU.

Cuando todas las señales de entrada se han asentado y propagado a través de los circuitos de la ALU, el resultado de la operación realizada aparece en las salidas de la ALU. El resultado consiste tanto en una palabra de datos, que puede almacenarse en un registro o memoria, como en información de estado que normalmente se almacena en un registro de CPU interno especial reservado para este propósito.

Unidad de generación de direcciones

Unidad de generación de direcciones (AGU), a veces también llamada unidad de cálculo de direcciones (ACU), es una unidad de ejecución dentro de la CPU que calcula las direcciones utilizadas por la CPU para acceder a la memoria principal. Al tener los cálculos de direcciones manejados por un circuito separado que opera en paralelo con el resto de la CPU, se puede reducir la cantidad de ciclos de CPU necesarios para ejecutar varias instrucciones de la máquina, lo que genera mejoras en el rendimiento.

Al realizar varias operaciones, las CPU necesitan calcular las direcciones de memoria requeridas para obtener datos de la memoria; por ejemplo, las posiciones en memoria de los elementos de la matriz deben calcularse antes de que la CPU pueda obtener los datos de las ubicaciones de memoria reales. Esos cálculos de generación de direcciones involucran diferentes operaciones aritméticas de enteros, como sumas, restas, operaciones de módulo o cambios de bits. A menudo, el cálculo de una dirección de memoria implica más de una instrucción de máquina de propósito general, que no necesariamente se decodifican y ejecutan rápidamente. Al incorporar una AGU en un diseño de CPU, junto con la introducción de instrucciones especializadas que usan la AGU, se pueden descargar varios cálculos de generación de direcciones del resto de la CPU y, a menudo, se pueden ejecutar rápidamente en un solo ciclo de CPU.

Las capacidades de una AGU dependen de una CPU en particular y su arquitectura. Por lo tanto, algunas AGU implementan y exponen más operaciones de cálculo de direcciones, mientras que otras también incluyen instrucciones especializadas más avanzadas que pueden operar en múltiples operandos a la vez. Algunas arquitecturas de CPU incluyen múltiples AGU, por lo que se puede ejecutar simultáneamente más de una operación de cálculo de direcciones, lo que brinda mejoras adicionales en el rendimiento debido a la naturaleza superescalar de los diseños avanzados de CPU. Por ejemplo, Intel incorpora varias AGU en sus microarquitecturas Sandy Bridge y Haswell, que aumentan el ancho de banda del subsistema de memoria de la CPU al permitir que se ejecuten en paralelo varias instrucciones de acceso a la memoria.

Unidad de gestión de memoria (MMU)

Muchos microprocesadores (en teléfonos inteligentes y computadoras de escritorio, portátiles y servidores) tienen una unidad de administración de memoria, que traduce las direcciones lógicas en direcciones RAM físicas, brindando protección de memoria y capacidades de paginación, útiles para la memoria virtual. Los procesadores más simples, especialmente los microcontroladores, generalmente no incluyen una MMU.

Caché

Un caché de CPU es un caché de hardware utilizado por la unidad central de procesamiento (CPU) de una computadora para reducir el costo promedio (tiempo o energía) para acceder a los datos de la memoria principal. Una caché es una memoria más pequeña y rápida, más cercana a un núcleo de procesador, que almacena copias de los datos de las ubicaciones de memoria principal que se usan con frecuencia. La mayoría de las CPU tienen diferentes cachés independientes, incluidas las cachés de instrucciones y datos, donde la caché de datos generalmente se organiza como una jerarquía de más niveles de caché (L1, L2, L3, L4, etc.).

Todas las CPU modernas (rápidas) (con algunas excepciones especializadas) tienen varios niveles de caché de CPU. Las primeras CPU que usaban caché tenían solo un nivel de caché; a diferencia de los cachés de nivel 1 posteriores, no se dividió en L1d (para datos) y L1i (para instrucciones). Casi todas las CPU actuales con caché tienen una caché L1 dividida. También tienen cachés L2 y, para procesadores más grandes, también cachés L3. La caché L2 generalmente no se divide y actúa como un depósito común para la caché L1 ya dividida. Cada núcleo de un procesador multinúcleo tiene una caché L2 dedicada y, por lo general, no se comparte entre los núcleos. La caché L3 y las cachés de nivel superior se comparten entre los núcleos y no se dividen. Actualmente, una caché L4 es poco común y, por lo general, se encuentra en una memoria dinámica de acceso aleatorio (DRAM), en lugar de una memoria estática de acceso aleatorio (SRAM), en un troquel o chip separado. Ese también fue el caso históricamente con L1, mientras que los chips más grandes han permitido la integración de él y, en general, todos los niveles de caché, con la posible excepción del último nivel. Cada nivel adicional de caché tiende a ser más grande y se optimiza de manera diferente.

Existen otros tipos de cachés (que no se cuentan para el "tamaño de caché" de los cachés más importantes mencionados anteriormente), como el búfer de búsqueda de traducción (TLB) que forma parte de la unidad de administración de memoria. (MMU) que tienen la mayoría de las CPU.

Los cachés generalmente tienen un tamaño de potencia de dos: 2, 8, 16, etc. KiB o MiB (para tamaños más grandes que no sean L1), aunque el IBM z13 tiene un caché de instrucciones L1 de 96 KiB.

Frecuencia de reloj

La mayoría de las CPU son circuitos síncronos, lo que significa que emplean una señal de reloj para marcar el ritmo de sus operaciones secuenciales. La señal del reloj es producida por un circuito oscilador externo que genera un número constante de pulsos cada segundo en forma de onda cuadrada periódica. La frecuencia de los pulsos del reloj determina la velocidad a la que una CPU ejecuta las instrucciones y, en consecuencia, cuanto más rápido sea el reloj, más instrucciones ejecutará la CPU cada segundo.

Para garantizar el funcionamiento adecuado de la CPU, el período del reloj es más largo que el tiempo máximo necesario para que todas las señales se propaguen (se muevan) a través de la CPU. Al establecer el período del reloj en un valor muy por encima del retraso de propagación en el peor de los casos, es posible diseñar toda la CPU y la forma en que mueve los datos alrededor de los "bordes" de la señal de reloj ascendente y descendente. Esto tiene la ventaja de simplificar significativamente la CPU, tanto desde la perspectiva del diseño como desde la perspectiva del número de componentes. Sin embargo, también tiene la desventaja de que toda la CPU debe esperar en sus elementos más lentos, aunque algunas partes son mucho más rápidas. Esta limitación se ha compensado en gran medida con varios métodos para aumentar el paralelismo de la CPU (ver más abajo).

Sin embargo, las mejoras arquitectónicas por sí solas no resuelven todos los inconvenientes de las CPU sincrónicas globales. Por ejemplo, una señal de reloj está sujeta a los retrasos de cualquier otra señal eléctrica. Las frecuencias de reloj más altas en CPU cada vez más complejas hacen que sea más difícil mantener la señal del reloj en fase (sincronizada) en toda la unidad. Esto ha llevado a muchas CPU modernas a requerir que se proporcionen múltiples señales de reloj idénticas para evitar retrasar una sola señal lo suficiente como para causar un mal funcionamiento de la CPU. Otro problema importante, ya que las velocidades de reloj aumentan drásticamente, es la cantidad de calor que disipa la CPU. El reloj en constante cambio hace que muchos componentes cambien independientemente de si se están utilizando en ese momento. En general, un componente que está cambiando usa más energía que un elemento en estado estático. Por lo tanto, a medida que aumenta la velocidad del reloj, también lo hace el consumo de energía, lo que hace que la CPU requiera más disipación de calor en forma de soluciones de enfriamiento de la CPU.

Un método para lidiar con el cambio de componentes innecesarios se llama sincronización de reloj, que consiste en apagar la señal del reloj de los componentes innecesarios (deshabilitarlos efectivamente). Sin embargo, esto a menudo se considera difícil de implementar y, por lo tanto, no tiene un uso común fuera de los diseños de muy baja potencia. Un diseño de CPU reciente notable que utiliza una activación de reloj extensa es el Xenon basado en IBM PowerPC que se usa en Xbox 360; de esa manera, los requisitos de energía de la Xbox 360 se reducen considerablemente.

CPU sin reloj

Otro método para abordar algunos de los problemas con una señal de reloj global es eliminar la señal de reloj por completo. Si bien la eliminación de la señal de reloj global hace que el proceso de diseño sea considerablemente más complejo en muchos sentidos, los diseños asíncronos (o sin reloj) tienen ventajas notables en el consumo de energía y la disipación de calor en comparación con diseños síncronos similares. Si bien es poco común, se han construido CPU asíncronas completas sin usar una señal de reloj global. Dos ejemplos notables de esto son el AMULET compatible con ARM y el MiniMIPS compatible con MIPS R3000.

En lugar de eliminar por completo la señal del reloj, algunos diseños de CPU permiten que ciertas partes del dispositivo sean asíncronas, como el uso de ALU asíncronas junto con canalización superescalar para lograr algunas ganancias de rendimiento aritmético. Si bien no está del todo claro si los diseños totalmente asíncronos pueden funcionar a un nivel comparable o mejor que sus contrapartes síncronas, es evidente que al menos sobresalen en operaciones matemáticas más simples. Esto, combinado con su excelente consumo de energía y propiedades de disipación de calor, los hace muy adecuados para computadoras integradas.

Módulo regulador de voltaje

Muchas CPU modernas tienen un módulo de administración de energía integrado en el troquel que regula el suministro de voltaje bajo demanda al circuito de la CPU, lo que le permite mantener el equilibrio entre el rendimiento y el consumo de energía.

Rango de enteros

Cada CPU representa valores numéricos de una manera específica. Por ejemplo, algunas de las primeras computadoras digitales representaban los números como valores familiares del sistema numérico decimal (base 10), y otras han empleado representaciones más inusuales, como ternario (base tres). Casi todas las CPU modernas representan números en forma binaria, con cada dígito representado por una cantidad física de dos valores, como un "alto" o "bajo" Voltaje.

Una palabra de seis bits que contiene la representación codificada binaria del valor decimal 40. La mayoría de las CPU modernas emplean tamaños de palabras que son un poder de dos, por ejemplo 8, 16, 32 o 64 bits.

Relacionado con la representación numérica está el tamaño y la precisión de los números enteros que puede representar una CPU. En el caso de una CPU binaria, esto se mide por la cantidad de bits (dígitos significativos de un entero codificado en binario) que la CPU puede procesar en una operación, lo que comúnmente se denomina tamaño de palabra, ancho de bit, ancho de ruta de datos, precisión de entero o tamaño de entero. El tamaño entero de una CPU determina el rango de valores enteros en los que puede operar directamente. Por ejemplo, una CPU de 8 bits puede manipular directamente números enteros representados por ocho bits, que tienen un rango de 256 (28) valores enteros discretos.

El rango de enteros también puede afectar la cantidad de ubicaciones de memoria que la CPU puede direccionar directamente (una dirección es un valor entero que representa una ubicación de memoria específica). Por ejemplo, si una CPU binaria utiliza 32 bits para representar una dirección de memoria, puede dirigirse directamente a 232 ubicaciones de memoria. Para eludir esta limitación y por varias otras razones, algunas CPU utilizan mecanismos (como el cambio de banco) que permiten direccionar memoria adicional.

Las CPU con tamaños de palabra más grandes requieren más circuitos y, en consecuencia, son físicamente más grandes, cuestan más y consumen más energía (y, por lo tanto, generan más calor). Como resultado, los microcontroladores más pequeños de 4 u 8 bits se usan comúnmente en las aplicaciones modernas, aunque hay disponibles CPU con tamaños de palabra mucho más grandes (como 16, 32, 64 e incluso 128 bits). Sin embargo, cuando se requiere un mayor rendimiento, los beneficios de un tamaño de palabra más grande (intervalos de datos y espacios de direcciones más grandes) pueden superar las desventajas. Una CPU puede tener rutas de datos internas más cortas que el tamaño de la palabra para reducir el tamaño y el costo. Por ejemplo, aunque el conjunto de instrucciones de IBM System/360 era un conjunto de instrucciones de 32 bits, System/360 Model 30 y Model 40 tenían rutas de datos de 8 bits en la unidad lógica aritmética, por lo que una adición de 32 bits requería cuatro ciclos, uno para cada 8 bits de los operandos y, aunque el conjunto de instrucciones de la serie Motorola 68000 era un conjunto de instrucciones de 32 bits, el Motorola 68000 y el Motorola 68010 tenían rutas de datos de 16 bits en la unidad lógica aritmética, de modo que un La adición de 32 bits requirió dos ciclos.

Para obtener algunas de las ventajas que ofrecen las longitudes de bit más altas y más bajas, muchos conjuntos de instrucciones tienen diferentes anchos de bits para datos enteros y de punto flotante, lo que permite que las CPU que implementan ese conjunto de instrucciones tengan diferentes anchos de bits para diferentes partes del dispositivo.. Por ejemplo, el conjunto de instrucciones de IBM System/360 era principalmente de 32 bits, pero admitía valores de coma flotante de 64 bits para facilitar una mayor precisión y rango en los números de coma flotante. El System/360 Model 65 tenía un sumador de 8 bits para aritmética binaria decimal y de punto fijo y un sumador de 60 bits para aritmética de punto flotante. Muchos diseños de CPU posteriores usan un ancho de bits mixto similar, especialmente cuando el procesador está diseñado para un uso de propósito general donde se requiere un equilibrio razonable de capacidad de enteros y punto flotante.

Paralelismo

Modelo de una CPU subscalar, en la que se necesitan quince ciclos de reloj para completar tres instrucciones

La descripción de la operación básica de una CPU ofrecida en la sección anterior describe la forma más simple que puede tomar una CPU. Este tipo de CPU, generalmente denominada subescalar, opera y ejecuta una instrucción en uno o dos datos a la vez, es decir, menos de una instrucción por ciclo de reloj (IPC < 1).

Este proceso genera una ineficiencia inherente en las CPU subescalares. Dado que solo se ejecuta una instrucción a la vez, toda la CPU debe esperar a que se complete esa instrucción antes de continuar con la siguiente instrucción. Como resultado, la CPU subescalar se "colgó" en instrucciones que toman más de un ciclo de reloj para completar la ejecución. Incluso agregar una segunda unidad de ejecución (ver más abajo) no mejora mucho el rendimiento; en lugar de colgar una vía, ahora se cuelgan dos vías y aumenta el número de transistores no utilizados. Este diseño, en el que los recursos de ejecución de la CPU pueden operar solo en una instrucción a la vez, solo puede alcanzar un rendimiento escalar (una instrucción por ciclo de reloj, IPC = 1). Sin embargo, el rendimiento casi siempre es subescalar (menos de una instrucción por ciclo de reloj, IPC < 1).

Los intentos de lograr un rendimiento escalar y mejor han resultado en una variedad de metodologías de diseño que hacen que la CPU se comporte de forma menos lineal y más en paralelo. Cuando se hace referencia al paralelismo en las CPU, generalmente se utilizan dos términos para clasificar estas técnicas de diseño:

Cada metodología difiere tanto en la forma en que se implementa como en la eficacia relativa que ofrece para aumentar el rendimiento de la CPU para una aplicación.

Paralelismo a nivel de instrucción

Gasoducto básico de cinco etapas. En el mejor escenario, este oleoducto puede mantener una tasa de terminación de una instrucción por ciclo del reloj.

Uno de los métodos más simples para aumentar el paralelismo es comenzar los primeros pasos de obtención y decodificación de instrucciones antes de que la instrucción anterior termine de ejecutarse. Esta es una técnica conocida como canalización de instrucciones y se utiliza en casi todas las CPU modernas de uso general. La canalización permite que se ejecuten varias instrucciones a la vez al dividir la ruta de ejecución en etapas discretas. Esta separación se puede comparar con una línea de montaje, en la que una instrucción se hace más completa en cada etapa hasta que sale del canal de ejecución y se retira.

La canalización, sin embargo, introduce la posibilidad de una situación en la que se necesita el resultado de la operación anterior para completar la siguiente operación; una condición a menudo denominada conflicto de dependencia de datos. Por lo tanto, los procesadores canalizados deben verificar este tipo de condiciones y retrasar una parte de la canalización si es necesario. Un procesador canalizado puede volverse casi escalar, inhibido solo por bloqueos de canalización (una instrucción que gasta más de un ciclo de reloj en una etapa).

Un simple oleoducto superscalar. Al buscar y enviar dos instrucciones a la vez, se puede completar un máximo de dos instrucciones por ciclo de reloj.

Las mejoras en la canalización de instrucciones condujeron a una mayor disminución del tiempo de inactividad de los componentes de la CPU. Los diseños que se dice que son superescalares incluyen una tubería de instrucción larga y varias unidades de ejecución idénticas, como unidades de almacenamiento de carga, unidades de lógica aritmética, unidades de punto flotante y unidades de generación de direcciones. En una canalización superescalar, las instrucciones se leen y pasan a un despachador, que decide si las instrucciones se pueden ejecutar en paralelo (simultáneamente) o no. En caso afirmativo, se envían a las unidades de ejecución, de lo que resulta su ejecución simultánea. En general, la cantidad de instrucciones que completará una CPU superescalar en un ciclo depende de la cantidad de instrucciones que pueda enviar simultáneamente a las unidades de ejecución.

La mayor parte de la dificultad en el diseño de una arquitectura de CPU superescalar radica en crear un despachador efectivo. El despachador debe poder determinar rápidamente si las instrucciones se pueden ejecutar en paralelo, así como despacharlas de tal manera que mantenga ocupadas tantas unidades de ejecución como sea posible. Esto requiere que la tubería de instrucciones se llene con la mayor frecuencia posible y requiere cantidades significativas de caché de CPU. También hace que las técnicas para evitar riesgos, como la predicción de bifurcaciones, la ejecución especulativa, el cambio de nombre de registros, la ejecución fuera de orden y la memoria transaccional, sean cruciales para mantener altos niveles de rendimiento. Al intentar predecir qué rama (o ruta) tomará una instrucción condicional, la CPU puede minimizar la cantidad de veces que toda la tubería debe esperar hasta que se complete una instrucción condicional. La ejecución especulativa a menudo proporciona aumentos de rendimiento modestos mediante la ejecución de partes de código que pueden no ser necesarias después de que se complete una operación condicional. La ejecución fuera de orden reorganiza un poco el orden en que se ejecutan las instrucciones para reducir los retrasos debido a las dependencias de datos. Además, en el caso de un solo flujo de instrucciones, múltiples flujos de datos, un caso en el que se debe procesar una gran cantidad de datos del mismo tipo, los procesadores modernos pueden desactivar partes de la tubería para que cuando una sola instrucción se ejecute muchas veces, la CPU omite las fases de búsqueda y decodificación y, por lo tanto, aumenta considerablemente el rendimiento en ciertas ocasiones, especialmente en motores de programas muy monótonos, como el software de creación de video y el procesamiento de fotografías.

Cuando solo una fracción de la CPU es superescalar, la parte que no lo es sufre una penalización de rendimiento debido a las paradas de programación. El Intel P5 Pentium tenía dos ALU superescalares que podían aceptar una instrucción por ciclo de reloj cada una, pero su FPU no. Por lo tanto, el P5 era un superescalar entero pero no un superescalar de punto flotante. El sucesor de Intel de la arquitectura P5, P6, agregó capacidades superescalares a sus funciones de punto flotante.

La canalización simple y el diseño superescalar aumentan el ILP de una CPU al permitirle ejecutar instrucciones a velocidades que superan una instrucción por ciclo de reloj. La mayoría de los diseños de CPU modernos son al menos algo superescalares, y casi todas las CPU de propósito general diseñadas en la última década son superescalares. En años posteriores, parte del énfasis en el diseño de computadoras de alto ILP se ha trasladado del hardware de la CPU a su interfaz de software, o arquitectura de conjunto de instrucciones (ISA). La estrategia de la palabra de instrucción muy larga (VLIW) hace que algunos ILP se impliquen directamente en el software, lo que reduce el trabajo de la CPU para impulsar el ILP y, por lo tanto, reduce la complejidad del diseño.

Paralelismo a nivel de tareas

Otra estrategia para lograr el rendimiento es ejecutar múltiples subprocesos o procesos en paralelo. Esta área de investigación se conoce como computación paralela. En la taxonomía de Flynn, esta estrategia se conoce como flujo de instrucciones múltiples, flujo de datos múltiples (MIMD).

Una tecnología utilizada para este propósito fue el multiprocesamiento (MP). El sabor inicial de esta tecnología se conoce como multiprocesamiento simétrico (SMP), donde una pequeña cantidad de CPU comparten una vista coherente de su sistema de memoria. En este esquema, cada CPU tiene hardware adicional para mantener una vista de la memoria constantemente actualizada. Al evitar las vistas obsoletas de la memoria, las CPU pueden cooperar en el mismo programa y los programas pueden migrar de una CPU a otra. Para aumentar la cantidad de CPU que cooperan más allá de un puñado, en la década de 1990 se introdujeron esquemas como el acceso a memoria no uniforme (NUMA) y los protocolos de coherencia basados en directorios. Los sistemas SMP están limitados a una pequeña cantidad de CPU, mientras que los sistemas NUMA se han creado con miles de procesadores. Inicialmente, el multiprocesamiento se creó utilizando múltiples CPU y placas discretas para implementar la interconexión entre los procesadores. Cuando los procesadores y su interconexión se implementan en un solo chip, la tecnología se conoce como multiprocesamiento a nivel de chip (CMP) y el chip único como un procesador multinúcleo.

Más tarde se reconoció que existía un paralelismo de grano más fino con un solo programa. Un solo programa puede tener varios subprocesos (o funciones) que pueden ejecutarse por separado o en paralelo. Algunos de los primeros ejemplos de esta tecnología implementaron el procesamiento de entrada/salida, como el acceso directo a la memoria como un hilo separado del hilo de cálculo. Un enfoque más general de esta tecnología se introdujo en la década de 1970 cuando los sistemas se diseñaron para ejecutar varios subprocesos de cálculo en paralelo. Esta tecnología se conoce como subprocesos múltiples (MT). Este enfoque se considera más rentable que el multiprocesamiento, ya que solo se replica una pequeña cantidad de componentes dentro de una CPU para admitir MT en lugar de toda la CPU en el caso de MP. En MT, las unidades de ejecución y el sistema de memoria, incluidos los cachés, se comparten entre varios subprocesos. La desventaja de MT es que el soporte de hardware para subprocesos múltiples es más visible para el software que el de MP y, por lo tanto, el software supervisor, como los sistemas operativos, debe sufrir cambios más grandes para admitir MT. Un tipo de MT que se implementó se conoce como subprocesamiento múltiple temporal, donde un subproceso se ejecuta hasta que se detiene esperando que los datos regresen de la memoria externa. En este esquema, la CPU cambiaría rápidamente de contexto a otro subproceso que está listo para ejecutarse, el cambio a menudo se realiza en un ciclo de reloj de la CPU, como el UltraSPARC T1. Otro tipo de MT es el subprocesamiento múltiple simultáneo, donde las instrucciones de varios subprocesos se ejecutan en paralelo dentro de un ciclo de reloj de la CPU.

Durante varias décadas, desde la década de 1970 hasta principios de la de 2000, el diseño de CPU de uso general de alto rendimiento se centró principalmente en lograr una ILP alta a través de tecnologías como canalización, cachés, ejecución superescalar, ejecución desordenada, etc. Esta tendencia culminó en grandes CPU que consumen mucha energía, como el Intel Pentium 4. A principios de la década de 2000, los diseñadores de CPU se vieron frustrados a la hora de lograr un mayor rendimiento de las técnicas ILP debido a la creciente disparidad entre las frecuencias operativas de la CPU y las frecuencias operativas de la memoria principal, así como a la creciente CPU disipación de energía debido a técnicas ILP más esotéricas.

Los diseñadores de CPU luego tomaron prestadas ideas de los mercados informáticos comerciales, como el procesamiento de transacciones, donde el rendimiento agregado de varios programas, también conocido como procesamiento de rendimiento, era más importante que el rendimiento de un solo hilo o proceso.

Esta inversión de énfasis se evidencia en la proliferación de diseños de procesadores duales y de más núcleos y, en particular, en los diseños más nuevos de Intel que se asemejan a su arquitectura P6 menos superescalar. Los últimos diseños en varias familias de procesadores exhiben CMP, incluidos x86-64 Opteron y Athlon 64 X2, SPARC UltraSPARC T1, IBM POWER4 y POWER5, así como varias CPU de consolas de videojuegos como el PowerPC de triple núcleo de Xbox 360. y el microprocesador Cell de 7 núcleos de la PlayStation 3.

Paralelismo de datos

Un paradigma menos común pero cada vez más importante de los procesadores (y, de hecho, de la informática en general) se ocupa del paralelismo de datos. Los procesadores discutidos anteriormente se conocen como algún tipo de dispositivo escalar. Como su nombre lo indica, los procesadores vectoriales manejan múltiples piezas de datos en el contexto de una instrucción. Esto contrasta con los procesadores escalares, que tratan con una pieza de datos para cada instrucción. Usando la taxonomía de Flynn, estos dos esquemas de manejo de datos se conocen generalmente como flujo de instrucción única, flujo de múltiples datos (SIMD) y flujo de instrucción única flujo de , flujo de datos únicos (SISD), respectivamente. La gran utilidad de crear procesadores que trabajen con vectores de datos radica en optimizar tareas que tienden a requerir la misma operación (por ejemplo, una suma o un producto escalar) para realizar en un gran conjunto de datos. Algunos ejemplos clásicos de este tipo de tareas incluyen aplicaciones multimedia (imágenes, video y sonido), así como muchos tipos de tareas científicas y de ingeniería. Mientras que un procesador escalar debe completar todo el proceso de obtención, decodificación y ejecución de cada instrucción y valor en un conjunto de datos, un procesador vectorial puede realizar una sola operación en un conjunto de datos comparativamente grande con una sola instrucción. Esto solo es posible cuando la aplicación tiende a requerir muchos pasos que aplican una operación a un gran conjunto de datos.

La mayoría de los primeros procesadores vectoriales, como el Cray-1, se asociaron casi exclusivamente con aplicaciones criptográficas y de investigación científica. Sin embargo, dado que la multimedia se ha desplazado en gran medida a los medios digitales, la necesidad de algún tipo de SIMD en los procesadores de propósito general se ha vuelto significativa. Poco después de que la inclusión de unidades de punto flotante comenzara a ser común en los procesadores de propósito general, también comenzaron a aparecer especificaciones e implementaciones de unidades de ejecución SIMD para procesadores de propósito general. Algunas de estas primeras especificaciones SIMD, como las extensiones de aceleración multimedia (MAX) de HP y MMX de Intel, eran solo de números enteros. Esto resultó ser un impedimento significativo para algunos desarrolladores de software, ya que muchas de las aplicaciones que se benefician de SIMD principalmente tratan con números de coma flotante. Progresivamente, los desarrolladores refinaron y rehicieron estos primeros diseños en algunas de las especificaciones SIMD modernas comunes, que generalmente se asocian con una arquitectura de conjunto de instrucciones (ISA). Algunos ejemplos modernos notables incluyen Streaming SIMD Extensions (SSE) de Intel y AltiVec relacionado con PowerPC (también conocido como VMX).

Contador de rendimiento de hardware

Muchas arquitecturas modernas (incluidas las integradas) a menudo incluyen contadores de rendimiento de hardware (HPC), lo que permite la recopilación, evaluación comparativa, depuración o análisis de bajo nivel (nivel de instrucción) de las métricas de software en ejecución. HPC también se puede usar para descubrir y analizar actividades inusuales o sospechosas del software, como programación orientada a retorno (ROP) o programación orientada a retorno (SROP), etc. Esto generalmente lo hacen los equipos de seguridad de software para evaluar y encontrar programas binarios maliciosos.

Muchos proveedores importantes (como IBM, Intel, AMD y Arm, etc.) proporcionan interfaces de software (generalmente escritas en C/C++) que se pueden usar para recopilar datos de los registros de CPU para obtener métricas. Los proveedores de sistemas operativos también ofrecen software como perf (Linux) para registrar, comparar o rastrear eventos de CPU que ejecutan kernels y aplicaciones.

CPU virtuales

La computación en la nube puede involucrar la subdivisión de la operación de la CPU en unidades de procesamiento central virtual (vCPU).

Un host es el equivalente virtual de una máquina física, en la que opera un sistema virtual. Cuando hay varias máquinas físicas operando en tándem y administradas como un todo, los recursos informáticos y de memoria agrupados forman un clúster. En algunos sistemas, es posible agregar y eliminar dinámicamente de un clúster. Los recursos disponibles a nivel de host y clúster se pueden particionar en grupos de recursos con granularidad fina.

Rendimiento

El rendimiento o velocidad de un procesador depende, entre muchos otros factores, de la frecuencia del reloj (generalmente dada en múltiplos de hercios) y de las instrucciones por reloj (IPC), que juntos son los factores de las instrucciones por segundo (IPS) que puede realizar la CPU. Muchos valores de IPS informados han representado valores "picos" tasas de ejecución en secuencias de instrucciones artificiales con pocas ramificaciones, mientras que las cargas de trabajo realistas consisten en una combinación de instrucciones y aplicaciones, algunas de las cuales tardan más en ejecutarse que otras. El rendimiento de la jerarquía de la memoria también afecta en gran medida el rendimiento del procesador, un problema que apenas se considera en los cálculos de MIPS. Debido a estos problemas, varias pruebas estandarizadas, a menudo llamadas "puntos de referencia" para este propósito—como SPECint—se han desarrollado para intentar medir el rendimiento efectivo real en aplicaciones de uso común.

El rendimiento de procesamiento de las computadoras aumenta mediante el uso de procesadores multinúcleo, lo que esencialmente consiste en conectar dos o más procesadores individuales (llamados núcleos en este sentido) en un circuito integrado. Idealmente, un procesador de doble núcleo sería casi el doble de potente que un procesador de un solo núcleo. En la práctica, la ganancia de rendimiento es mucho menor, solo alrededor del 50%, debido a la implementación y los algoritmos de software imperfectos. Aumentar la cantidad de núcleos en un procesador (es decir, doble núcleo, cuatro núcleos, etc.) aumenta la carga de trabajo que se puede manejar. Esto significa que el procesador ahora puede manejar numerosos eventos asincrónicos, interrupciones, etc. que pueden afectar a la CPU cuando se sobrecarga. Estos núcleos se pueden considerar como diferentes pisos en una planta de procesamiento, cada piso manejando una tarea diferente. A veces, estos núcleos manejarán las mismas tareas que los núcleos adyacentes si un solo núcleo no es suficiente para manejar la información.

Debido a las capacidades específicas de las CPU modernas, como subprocesos múltiples simultáneos y uncore, que implican compartir los recursos reales de la CPU mientras se busca una mayor utilización, monitorear los niveles de rendimiento y el uso del hardware gradualmente se convirtió en una tarea más compleja. Como respuesta, algunas CPU implementan una lógica de hardware adicional que supervisa el uso real de varias partes de una CPU y proporciona varios contadores a los que puede acceder el software; un ejemplo es la tecnología Performance Counter Monitor de Intel.