¿Cómo se diseñan y se construyen las CPU?

Todos creemos que la únidad central de procesamiento es el «cerebro» de un PC,  ¿qué es lo que significa eso de todos modos? ¿Qué ocurre dentro con los cientos de millones de transistores para lograr que tu PC ande? Nos vamos a centrar en el diseño de hardware, cubriendo los datos de lo que provoca que un PC ande.

La serie cubrirá la arquitectura de la PC, el diseño de los circuitos del procesador, VLSI (integración a muy enorme escala), la fabricación de chips y las futuras tendencias en computación. Si siempre te han entusiasmado los datos de cómo trabajan los procesadores por la parte interior, quédate porque o sea lo que tienes ganas de saber para iniciar.

Sección primera: Argumentos de la Arquitectura de PCs
(arquitecturas de conjuntos de normas, caching, cañerías, hyperthreading)

Parte 2: Desarrollo de diseño de la únidad central de procesamiento
(esquemas, transistores, puertas lógicas, relojes)

Parte 3: Diseño y construcción física del chip
(VLSI y fabricación de silicio)

Parte 4: Tendencias recientes y futuros temas candentes en la arquitectura de los ordenadores
(Mar de Aceleradores, integración tres dimensiones, FPGAs, Computación de Memoria Próxima)

Empezaremos con un nivel altísimo de lo que hace un procesador y cómo los bloques de construcción se unen en un diseño servible. Esto tiene dentro los núcleos del procesador, la jerarquía de memoria, la predicción de ramas y más. Primero, requerimos una definición básica de lo que hace un únidad central de procesamiento. La explicación más fácil es que un únidad central de procesamiento prosigue un grupo de normas para hacer alguna operación en un grupo de entradas. Entre otras cosas, esto podría ser leer un valor de la memoria, después agregarlo a otro valor y al final guardar el resultado otra vez en la memoria en una ubicación diferente. Además podría ser algo más complejo, como dividir dos números si el resultado del cálculo previo fuera más grande que cero.

En el momento en que se desea realizar un programa como un S.O. o bien un juego, el software en sí es una sucesión de normas a fin de que la únidad central de procesamiento lo ejecute. Estas normas se cargan desde la memoria y en un procesador fácil, se ejecutan una por una hasta el momento en que el software acaba. En tanto que los programadores de programa escriben sus programas en idiomas de prominente nivel como C++ o bien Python, entre otras cosas, el procesador no puede comprender eso. Solo sabe los 1 y los 0, de este modo que requerimos una manera de representar el código en este formato.

 

 

Los programas se compilan en un grupo de normas de bajo nivel llamado lenguaje ensamblador como una parte de una Arquitectura de Grupo de Normas (ISA). Este es el grupo de normas que la únidad central de procesamiento está construida para comprender y realizar. Ciertas ISA más habituales son x86, MIPS, ARM, RISC-V y PowerPC. Del mismo modo que la sintaxis para redactar una función en C++ es diferente de una función que hace lo mismo en Python, cada ISA tiene una sintaxis diferente.

Estas ISA tienen la posibilidad de dividirse en dos categorías primordiales: de longitud fija y de longitud variable. El RISC-V ISA usa normas de longitud fija, lo que supone que un cierto número predefinido de bits en todos y cada instrucción establece de qué género de instrucción se habla. O sea diferente de x86 que usa normas de longitud variable. En x86, las normas tienen la posibilidad de ser codificadas de distintas formas y con distintas números de bits para distintas partes. Gracias a esta dificultad, el decodificador de normas en las únidad central de procesamiento x86 es típicamente la parte más complicada de todo el diseño.

Las normas de longitud fija aceptan una decodificación más fácil gracias a su composición regular, mas limitan el total de normas que una ISA puede aguantar. En tanto que las ediciones recurrentes de la arquitectura RISC-V tienen cerca de 100 normas y son de código abierto, x86 es dueña y nadie sabe verdaderamente cuántas normas hay. La multitud por lo general piensa que hay unos pocos cientos de normas x86 mas el número exacto no es público. Más allá de las diferencias entre las ISA, todas y cada una llevan fundamentalmente exactamente la misma ocupación central.

 

 

Ejemplo de ciertas normas del RISC-V. El opcode de la derecha es de 7 bits y establece el género de instrucción. Cada instrucción además tiene dentro bits para qué registros usar y qué funcionalidades hacer. De este modo es como las normas de ensamblaje se desglosan en binario a fin de que una únidad central de procesamiento las comprenda.

En este momento nos encontramos completados para prender nuestro PC y iniciar a realizar cosas. La ejecución de una instrucción de todos modos tiene numerosas partes básicas que se descomponen mediante las muchas etapas de un procesador.

Lo primero que hay que hacer es traer la instrucción de la memoria a la únidad central de procesamiento para empezar la ejecución. En el segundo paso, la instrucción se decodifica a fin de que la únidad central de procesamiento logre saber qué género de instrucción es. Existen muchos tipos, introduciendo las normas aritméticas, las normas de rama y las normas de memoria. Cuando la únidad central de procesamiento sabe qué género de instrucción está corriendo, los operandos de la instrucción se recogen de la memoria o bien de los registros internos de la únidad central de procesamiento. Si se desea añadir el número A al número B, es imposible llevar a cabo la adición hasta el momento en que se conozcan verdaderamente los valores de A y B. La mayor parte de los procesadores modernos son de 64 bits, lo que supone que el tamaño de cada valor de datos es de 64 bits.

 

 

64 bits hace referencia al ancho de un registro de la únidad central de procesamiento, la ruta de datos y/o bien la dirección de la memoria. Para los individuos cotidianos eso significa cuánta información puede conducir una PC al unísono, y se sabe mejor en frente de su primo arquitectónico más pequeño, 32-bit. La arquitectura de 64 bits puede conducir el doble de bits de mucha información al unísono (64 bits contra 32).

Una vez que la únidad central de procesamiento tiene los operandos para la instrucción, pasa a la etapa de ejecución donde la operación se hace en la entrada. Esto podría ser añadir los números, hacer una manipulación lógica de los números, o bien sencillamente pasar los números sin alterarlos. Una vez que se calcula el resultado, puede ser primordial entrar a la memoria para guardar el resultado o bien la únidad central de procesamiento podría sencillamente sostener el valor en uno de sus registros internos. Una vez guardado el resultado, la únidad central de procesamiento actualizará el estado de numerosos elementos y va a pasar a la próxima instrucción.

Esta descripción es, desde luego, una gran simplificación y la mayor parte de los procesadores modernos van a dividir estas escasas etapas en 20 o bien más etapas más pequeñas para hacer mejor la eficacia. Esto quiere decir que aunque el procesador empezará y acabará numerosas normas cada período, puede tomar 20 o bien más ciclos a fin de que solo una instrucción se complete de inicio a fin. Este modelo se llama típicamente «pipeline» (tubería), ahora que toma un tiempo para atestar la tubería y a fin de que el líquido la atraviese totalmente, mas cuando está llena, se consigue una salida recurrente.

 

 

Ejemplo de tubería de 4 etapas. Las cajas de color representan normas independientes entre sí.
Crédito de la imagen: Wikipedia

Todo el período por el que sucede una instrucción es un desarrollo muy apretado, mas sólo algunas de las normas tienen la posibilidad de finalizar de forma simultanea. Entre otras cosas, la adición es rapidísima en tanto que la división o bien la carga de la memoria puede tomar centenares de ciclos. En vez de parar todo el procesador mientras que una instrucción lenta acaba, la mayor parte de los procesadores modernos ejecutan fuera de servicio. Eso supone que determinarán qué instrucción sería la más ventajosa para realizar en un instante particular y almacenarán en la memoria media otras normas que no estén listas. Si la instrucción de hoy no está ya lista todavía, el procesador puede saltar hacia adelante en el código para poder ver si hay algo más listo.

Aparte de la ejecución fuera de servicio, los procesadores modernos habituales emplean lo que se denomina una arquitectura superescalar. Esto quiere decir que en un instante particular, el procesador está corriendo muchas normas al unísono en todos y cada etapa de la tubería. Además puede estar aguardando cientos más para empezar su ejecución. Para lograr realizar muchas normas al unísono, los procesadores van a tener numerosas copias de cada etapa de la tubería dentro suyo. Si un procesador ve que dos normas están listas para ser ejecutadas y no hay dependencia entre , en vez de aguardar a que acaben separadamente, las ejecutará las dos de forma simultanea. Una implementación común de esto se denomina Multihilo Simultáneo (SMT), además popular como Hyper-Threading. Los procesadores de Intel y AMD hoy en día aguantan SMT de dos vías, en tanto que IBM ha creado chips que aguantan SMT de hasta ocho vías.

Para conseguir esta ejecución atentamente coreografiada, un procesador tiene bastantes elementos plus aparte del núcleo básico. Hay centenares de módulos particulares en un procesador que cada uno de ellos se utiliza para un propósito concreto, mas repasaremos lo básico. Los dos más enormes y más ventajosos son los cachés y el predictor de ramas. Las construcciones complementarios que no cubriremos tienen dentro cosas como buffers de reordenación, tablas de nick de registro y estaciones de reserva.

El propósito de los cachés puede ser comunmente raro ahora que guardan datos como la RAM o bien un SSD. No obstante, lo que distingue a los cachés es su latencia y agilidad de ingreso. Más allá de que la RAM es increíblemente veloz, es de órdenes de intensidad bastante lentas para una únidad central de procesamiento. La RAM puede demorar centenares de ciclos en contestar con datos y el procesador se quedaría atascado sin nada que llevar a cabo. Si los datos no están en la RAM, puede tomar millones de ciclos a fin de que se logre entrar a los datos en un SSD. Sin los cachés, nuestros procesadores se detendrían.

Los procesadores acostumbran tener tres escenarios de caché que forman lo que se conoce como una jerarquía de memoria. El caché L1 es el más pequeño y veloz, el L2 está en el medio, y el L3 es el más grande y retardado de los cachés. Sobre los cachés en la jerarquía hay pequeños registros que guardan un único valor de datos a lo largo del cálculo. Estos registros son los gadgets de alojamiento más veloces en su sistema por órdenes de intensidad. En el momento en que un compilador convierte un programa de prominente nivel en lenguaje ensamblador, determinará la mejor forma de usar estos registros.

En el momento en que la únidad central de procesamiento pida datos de la memoria, primero verificará si esos datos ahora están guardados en la caché L1. Si lo está, se puede entrar rápidamente a los datos en solo unos pocos ciclos. Si no está presente, la únidad central de procesamiento verificará la L2 y más adelante procurará en la caché L3. Los cachés se incorporan de forma que por lo general son con transparencia hasta el núcleo. El núcleo solo solicitará determinados datos en una dirección de memoria detallada y algún nivel de la jerarquía que lo tenga responderá. Mientras avanzamos a las etapas siguientes en la jerarquía de la memoria, el tamaño y la latencia típicamente incrementan en órdenes de intensidad. En el final, si la únidad central de procesamiento no puede hallar los datos que busca en ninguno de los cachés, solo entonces irá a la memoria primordial (RAM).

 

 

En un procesador habitual, cada núcleo va a tener dos cachés L1: uno para datos y otro para normas. Los cachés L1 son típicamente de cerca de 100 kilobytes en suma y el tamaño puede cambiar en dependencia del chip y la generación. Además acostumbra haber un caché L2 para cada núcleo, aunque en varias arquitecturas puede compartirse entre dos núcleos. Los cachés L2 tienden a ser de unos pocos centenares de kilobytes. Por último, hay un único caché L3 que se comparte entre todos y cada uno de los núcleos y es del orden de incontables megabytes.

En el momento en que un procesador ejecuta un código, las normas y los valores de datos que usa con una mayor frecuencia se guardan en la caché. Esto hace más rápido considerablemente la ejecución, ahora que el procesador no debe ir todo el tiempo a la memoria primordial para los datos que requiere. Vamos a hablar más sobre cómo estos sistemas de memoria se incorporan verdaderamente en la segunda y tercera distribución de esta serie.

Aparte de los cachés, otro de los bloques de construcción clave de un procesador moderno es un predictor de ramas exacto. Las normas de las ramas son semejantes a las afirmaciones de «si» de un procesador. Un grupo de normas se ejecutará si la condición es verídica y otro se ejecutará si la condición es falsa. Entre otras cosas, puede estimar contrastar dos números y si son iguales, realizar una función, y si no son iguales, realizar otra función. Estas normas de rama son muy recurrentes y tienen la posibilidad de constituir precisamente el 20% de todas y cada una de las normas de un programa.

En la área, estas normas de rama tienen la posibilidad de no parecer un inconveniente, mas de todos modos tienen la posibilidad de ser realmente difíciles a fin de que un procesador ande de manera correcta. Ya que en un instante particular, la únidad central de procesamiento puede estar en desarrollo de realizar diez o bien veinte normas al unísono, es primordial entender qué normas realizar. Puede tomar 5 ciclos para saber si la instrucción de hoy es una rama y otros 10 ciclos para saber si la condición es verídica. En ese tiempo, el procesador probablemente halla empezado a realizar docenas de normas complementarios sin entender siquiera si esas eran las normas adecuadas para realizar.

Para evadir este inconveniente, todos y cada uno de los procesadores modernos de prominente desempeño emplean una técnica llamada especulación. Lo que esto quiere decir es que el procesador va a hacer un rastreo de las normas de la rama y adivinará si la rama será tomada o bien no. Si la predicción es precisa, el procesador ahora empezó a realizar las normas siguientes, por lo cual esto brinda una ganancia de desempeño. Si la predicción es errónea, el procesador detiene la ejecución, descarta todas y cada una de las normas incorrectas que empezó a realizar y empieza otra vez desde el punto preciso.

Estos predictores de ramas son ciertas primeras maneras de estudio de la máquina, ahora que el predictor aprende el accionar de las ramas mientras avanza. Si pronostica incorrectamente demasiadas ocasiones, empezará a estudiar el accionar acertado. Décadas de investigación en técnicas de predicción de ramas dieron como resultado precisiones superiores al 90% en los procesadores modernos.

En tanto que la especulación da inmensas ganancias de desempeño ahora que el procesador puede realizar normas que están listas en vez de aguardar en la fila de las que están ocupadas, además muestra las inseguridades de seguridad. El popular ataque Spectre explota los fallos en la predicción y especulación de ramas. El agresor emplearía código principalmente elaborado para lograr que el procesador ejecutase especulativamente código que filtrase valores de memoria. Determinados puntos de la especulación tuvieron que ser rediseñados para garantizar que los datos no se filtrasen, lo que provocó una rápida disminución del desempeño.

La arquitectura usada en los procesadores modernos ha adelantado bastante en las últimas décadas. Las creaciones y el diseño capaz dieron como resultado un más grande desempeño y una mejor utilización del hardware subyacente. No obstante, los desarrolladores de únidad central de procesamiento son muy reservados sobre las tecnologías de sus procesadores, por lo cual es realmente difícil entender precisamente lo que pasa dentro suyo. Mencionado lo anterior, los argumentos de cómo trabajan las PCs están estandarizados en todos y cada uno de los procesadores. Intel puede añadir su salsa segrega para incrementar la tasa de aciertos en la caché o bien AMD puede añadir un predictor de rama adelantado, mas los dos hacen exactamente la misma labor.

Parte 1: Argumentos de la Arquitectura de PCs
(arquitecturas de conjuntos de normas, caching, cañerías, hyperthreading)
Parte 2: Desarrollo de diseño de la únidad central de procesamiento
(esquemas, transistores, puertas lógicas, relojes)
Parte 3: Diseño y construcción física del chip
(VLSI y fabricación de silicio)
Parte 4: Tendencias recientes y futuros temas candentes en la arquitectura de los ordenadores
(Mar de Aceleradores, integración tres dimensiones, FPGAs, Computación de Memoria Próxima)
Esta primera mirada y visión general cubrió la mayor parte de los puntos básicos sobre el desempeño de los procesadores. En la segunda parte, discutiremos cómo se diseñan los elementos que entran en la únidad central de procesamiento, cubriendo las puertas lógicas, el reloj, la administración de la energía, los esquemas de los circuitos y más.

Deja un comentario

Cerrar menú