====== 03. Procesadores ====== ====== Material ====== ===== Procesadores ===== El procesador ejecuta una serie de instrucciones en código máquina. Estas instrucciones no son mas que "números" en binario que entran a través del Bus desde la RAM. Cuando llegan esos "números" se realizan una serie de cálculos. El resultado de los cálculos del procesador se puede almacenar en la RAM, en el sistema de Entrada/Salida o dentro del procesador en una pequeña memoria llamada "REGISTROS". Estos registros los usa el programador para almacenar datos temporales y no tener que almacenarlos en la RAM. ===== Arquitectura del Conjunto de Instrucciones (ISA) ===== * [[https://en.wikipedia.org/wiki/Instruction_set_architecture|Instruction set architecture]] Una Arquitectura del Conjunto de Instrucciones (ISA) especifica las instrucciones que "entiende" el procesador y los registros que posee dicho procesador. Por lo que para un programador , lo importante de un procesador es su ISA ya que indica como va a poder el programador , programar ese procesador. A la ISA también se le llama a veces simplemente "Arquitectura", pero no confundir con la "Microarquitectura" (Que vamos a ver también en este tema) ^ Nombre ISA ^ Empresa que la ha creado ^ Ámbito ^ | x86 (tambien llamada IA32) | Intel | PC de hasta de 4 GB de RAM | | x64 (tambien llamada AMD64, EM64T, x86-64, Intel 64)| AMD | PC con mas de 4 GB de RAM | | ARMv7 (tambien llamada AArch32)| ARM | Móviles,tablet,etc de hasta de 4 GB de RAM | | ARMv8 (tambien llamada AArch64)| ARM | Móviles,tablet,etc con mas de 4 GB de RAM | | Power | IBM | Estaciones de trabajo RISC, Antiguos Mac y en consolas como PS3 y XBox 360. [[https://www.vidaextra.com/ps3/la-desquiciante-historia-en-la-que-el-desarrollo-de-cell-sento-la-base-del-procesador-de-xbox-360|La desquiciante historia en la que el desarrollo de Cell, sentó la base del procesador de Xbox 360]] | | SPARC | Oracle/Sun | Estaciones de trabajo RISC | | RISC-V | RISC-V Fundation | Pretende ser una alternativa a ARM que no pueda ser censurada por los gobiernos. [[https://blog.desdelinux.net/risc-v-pude-ser-la-clave-para-que-huawei-no-sea-afectado-por-el-veto-comercial/|RISC-V pude ser la clave para que Huawei no sea afectado por el veto comercial]] , [[https://www.linuxadictos.com/risc-v-cambiara-su-sede-de-usa-a-suiza-por-temores-comerciales.html|RISC-V cambiara su sede de USA a Suiza por temores comerciales]] , [[https://hackaday.com/2019/11/12/risc-v-why-the-isa-battles-arent-over-yet/|RISC-V: Why The ISA Battles Aren't Over Yet]] y [[https://www.linuxadictos.com/alibaba-presento-los-nuevos-procesadores-risc-v-xuantie.html|Alibaba presento los nuevos procesadores RISC-V XuanTie]] | Lo importante de una ISA es que un programa de ordenador solo puede ser escrito para una ISA concreta y no funcionará para otra ISA. Aunque también un programa, debido a que funciona sobre un sistema operativo, el programa debe ser programador pensando tanto en la ISA como en el Sistema Operativo. Información sobre cada una de las ISAs * [[https://es.wikipedia.org/wiki/X86|]] * [[https://es.wikipedia.org/wiki/X86-64]] * [[https://en.wikipedia.org/wiki/ARM_architecture|]] * [[https://en.wikipedia.org/wiki/Power_ISA|]] * [[https://en.wikipedia.org/wiki/SPARC|]] * [[https://en.wikipedia.org/wiki/RISC-V]] Normalmente las ISA se organizan en si son de 32 bits o de 64 bits. La diferencia principal es la cantidad de RAM a la que pueden acceder. Ya que esos 32 o 64 , es el Nº de Bits que se envían por el bus para indicar el Nº de celda de la RAM a leer o escribir. Decir que las arquitecturas de PC (x86 y x64) al necesitar procesadores muy "grandes", tienen un gran consumo energético y son caros, aunque tengan un gran rendimiento. Por ello Apple ha decidido pasar de los procesadores con la ISA de x64 a procesadores con la ISA ARMv8. ===== Características de las ISA ===== Las ISA tiene 2 características principales: * Complejidad de las instrucciones: * CICS: Tienen muchas instrucciones y cada instrucción puede hacer muchas cosas. * RISC: Tienen pocas instrucciones y cada instrucción hace una única cosa. * Cantidad máxima de la RAM a la que puede acceder: * 32 Bits: Solo pueden acceder como máximo a 4 GigaBytes de RAM. Ya que 232=4 GB. * 64 Bits: Pueden acceder a 16 ExaBytes de RAM. Ya que 264=16 EB. ^ Complejidad/Máxima RAM ^ 32 Bits ^ 64 Bits ^ ^ CISC | x86 | x64 | ^ RISC | ARMv7, Power, SPARC, RISC-V | ARMv8, Power, SPARC, RISC-V | Como podemos ver , excepto para los PC, el resto de ISA son de tipo RISC. Esto es así ya que las ISA CISC son muy antiguas y poco eficientes. En la actualidad se siguen usando en los PCs por motivos de compatibilidad hacia atrás. ===== Ensamblador ===== El lenguaje ensamblado es el lenguaje que usamos las personas para escribir programas para un procesador. Prácticamente es como indicar los "números" directamente al procesador pero de una forma mas legible para una persona. El código máquina se refiere a los números directamente que entiende el ordenador y que es lo que se almacena en la RAM. Como ejemplo de ensamblador vamos a usar el procesador Z-80 (un procesador de 8 bits) ya que es muy sencillo. El Z-80 tiene: * Entre otros dos registros llamados "A" y "B" * Una ALU Veamos el siguiente programa en ensamblador: LD A,(#F2A3) LD B,A LD A,(#F2A4) ADD A,B LD (#F2A5),A Vamos a explicar línea por línea: * **LD A,(#F2D3)**: Lee el valor de la celda de memoria "F2D3" y la carga en el registro **A** . Notar que el Nº de la celda está en hexadecimal * **LD B,A**: Carga en el registro **B** el valor del registro **A**. Es realmente copiar el valor de un registro en otro. * **LD A,(#F2D4)**: Lee el valor de la celda de memoria "F2D4" y la carga en el registro **A**. Notar que el Nº de la celda está en hexadecimal * **ADD A,B**: Usando la ALU,suma el valor del registro **A** y el registro **B** y deja el resultado en el registro **A** * **LD (#F2D5),A**: Guarda en la posición de memoria "F2D5" el valor del registro **A** ¿Que hace realmente eso? Simplemente **suma** el contenido de las celdas de memoria "F2D3" y "F2D4" dejando el resultado en "F2D5". Ahora veamos ese programa como sería en código máquina ^ Instrucción en ensamblador ^ Instrucción en código máquina ^ | LD A,(#F2D3) | 3AF2D3 | | LD B,A | 47 | | LD A,(#F2D4) | 3AF2D4 | | ADD A,B | 88 | | LD (#F2D5),A | 32F2D5 | Es decir que en la RAM, en las celdas realmente lo que se guarda es el código máquina que son los siguientes bytes de forma consecutiva: 3A F2 D3 47 3A F2 D4 88 32 F2 D5 Otra forma de ver el código máquina es la siguiente, en la que vemos en cada celda de la RAM, el valor que tiene. ^ Posición de la RAM ^ Valor ^ | 0000 | 3A | | 0001 | F2 | | 0002 | D3 | | 0003 | 47 | | 0004 | 3A | | 0005 | F2 | | 0006 | D4 | | 0007 | 88 | | 0008 | 32 | | 0009 | F2 | | 000A | D5 | | ... | | | ... | | | F2D3 | 3 | | F2D4 | 5 | | F2D5 | | | ... | | | ... | | | FFFE | | | FFFF | | Cuando vemos ese números , no tiene mucho significado pero como acabamos de ver , son las instrucciones que se dan al procesador. Hemos dicho que los programa de ordenador son distintos para cada ISA ya que en cada ISA los registros son distintos y además el código máquina también es totalmente distinto. En la siguiente página: [[http://schweigi.github.io/assembler-simulator/]], podemos ejecutar el siguiente programa que es muy similar de una ISA distinta: start: MOV A, [13] MOV B, [14] ADD A,B MOV [15], A HLT DB 3; DB 5; DB 0; Que suma los valores 3 y 5 que hay en las posiciones de memoria 13 y 14. Dejan el resultado en la posición de memoria 15 Si te interesa mas el lenguaje ensamblador. Puedes leerte el libro {{:clase:asir:fhw:1eval:assembly64.pdf |x86-64 Assembly Language Programming with Ubuntu}} ¿Que relación tiene el siguiente artículo con lo que acabamos de contar? [[https://hardzone.es/noticias/juegos/cyberpunk-2077-amd-problemas-solucion/|Cyberpunk 2077 tiene peor rendimiento en CPUs AMD Ryzen, ¿por qué?]] ===== Unidades Funcionales ===== Ahora vamos a ver como es el procesador por dentro, como ya hemos indicado , el procesador tiene una serie de registros que vienen determinados por la ISA. Junto con ellos dentro del procesador están las siguientes unidades funcionales: {{procesador.png|}} * **Unidad de Control**: Es que la que organiza todo el procesador para que realice cada unidad su trabajo . Es el verdadero cerebro de la CPU * **Registros**: Son como variable dentro del procesador. Ocupan unos pocos bytes cada uno de ellos. * **ALU**: Realiza operaciones aritméticas sin decimales (sumas, restas, etc) * **FPU**: Realiza operaciones aritméticas **CON** decimales (sumas, restas,divisiones,multiplicaciones, etc) * **Unidad de predicción de saltos**: En caso de un salto (instrucción de ''if'' o ''for'') aquí predice cual es el siguiente código a ejecutar. * **Cache**: Es una copia de la RAM con los datos que mas se usan. Cuanto mayor tamaño mejor ya que la RAM es muy lenta y sin datos o programa , la CPU debe esperar a leer de la RAM. Existen 3 tipos de cache. L1, L2 y L3. En la siguiente imagen podemos ver las unidades en un procesador Zen de AMD: {{cpu-units.png|}} * Decode y Scheduler: Forma parte de la Unidad de control. * Registros: No aparecen los registro en el esquema ya que físicamente ocupan poquísimo * ALU: Es la ALU * Floating Point: Es la FPU * Branch Prediction: Es la Unidad de predicción de saltos * Data cache: Es la cache L1 con datos * ICache: Es la cache L1 con instrucciones * Load/Store: Leer y escribe los datos en la RAM * L2: Junto al procesador se encuentra otra cache llamada L2 que es mas grande que la L1 pero mas lenta. ===== Microarquitectura ===== Es como los ingenieros diseñan el procesador para ser lo mas rápido posible. En los procesadores de Intel son cada una de las generaciones. 1º Gen, 2º Gen , etc. En los procesadores AMD tenemos Zen, Zen+ , Zen 2, Zen 3. Cada año que pasa , se diseñan mejores microarquitecturas para hacer mas rápido el procesador pero su ISA es la misma para de esa forma que los programas sigan sirviendo en el nuevo procesador. Por lo tanto al comprar un procesador lo que nos interesa saber es su microarquitectura ya que eso determina el rendimiento. ===== Fabricante ===== Es el que finalmente fabrica el procesador (o cualquier otro chip) en las fábricas de procesadores. No tiene porque ser la misma empresa que diseña la microarquitectura o crea la ISA. Hay pocas fabricas de chips en el mundo. En la siguiente página de la Wikipedia podemos ver las fábricas que hay [[https://en.wikipedia.org/wiki/List_of_semiconductor_fabrication_plants|Lista de plantas de fabricación de semicondictores]] Veamos ahora un resumen de los 3 parámetros (ISA, Microarquitectura, Fabricante) ^ Modelo de Procesador ^ ISA ^ Empresa que diseña la ISA ^ Empresa que diseña el Procesador\\ (Microarquitectura) ^ Empresa que fabrica el procesador ^ | Intel i486DX | x86 | Intel | Intel | Intel | | AMD Am486 | x86 | Intel | AMD | AMD | | Intel Core i7-10700K | x64 | AMD | Intel | Intel | | AMD Ryzen 9 3900X 3.8 GHz | x64 | AMD | AMD | TSMC | | Snapdragon 800 | ARMv7 | ARM | Qualcomm | TSMC | | A5 | ARMv7 | ARM | Apple | Samsung | | Snapdragon 865 | ARMv8 | ARM | Qualcomm | TSMC | | A11 | ARMv8 | ARM | Apple | TSMC | | Exynos 990 | ARMv8 | ARM |Samsung | Samsung | Lo importante de esto es realmente la microarquitectura, ya que es lo de determina el rendimiento. Quien lo fabrique finalmente es lo de menos y el ISA que se usa no es muy determinante ya que por ahora en PC el ISA es el x64 y en móviles el ARMv8. Aunque es un movimiento genial de Apple, va a empezar a sacar Mac con procesadores ARM!!!!. * [[https://appleinsider.com/articles/20/06/09/how-arm-has-already-saved-apple---twice|How ARM has already saved Apple - twice]] * [[https://appleinsider.com/inside/arm-mac|ARM Mac]] * [[https://www.applesfera.com/rumores/chip-arm-proximos-macbook-puede-ser-bestia-potencia-derivada-a12-bionic|El chip ARM "T3" de los próximos MacBook puede superar en rendimiento incluso a los de Intel]] * [[https://www.xataka.com/ordenadores/insorportable-inevitabilidad-macbook-arm|La insorportable inevitabilidad del MacBook ARM]] * [[https://www.extremetech.com/computing/295703-apple-could-switch-to-arm-but-replacing-xeon-is-no-simple-endeavor|Apple Could Switch to ARM, But Replacing Xeon Is No Simple Endeavor]] Así que cuando decimos que un procesador es de cierta empresa , estamos diciendo que dicha empresa ha diseñado la microarquitectura de dicho procesador, aunque no ha ya creado ni la ISA ni lo haya finalmente fabricado. Aunque vamos a complicar un poco mas las cosas para los procesadores ARM. Hemos dicho que ARM ha creado las ISAs (ARMv7 y ARMv8) pero también diseña microarquitecturas. Son los llamados "Cortex-A55, Cortex-A75, etc). Así que cuando decimos que Samsung ha diseñado el procesador "Exynos 990" , realmente lo que hace es usar alguna microarquitectura "Cortex" en ese procesador o modificaciones de ella. Aunque Apple en sus últimos procesadores ya diseña prácticamente todo el procesador. ===== Núcleos e hilos ===== Hemos visto como es un procesador o CPU, pero ahora hay que distinguir entre los siguientes 3 conceptos: * Procesador o CPU * Núcleo * Hilos por núcleo Veamos cada uno de ellos * Procesador o CPU: Es el "aparator" que compras, que tienes en la mano y que pones en la placa base. * Núcleos: Los procesadores actuales realmente tiene dentro varios "subprocesadores" a lo que ahora se les llama núcleos o core en inglés. Es como tener 2 procesadores dentro de un solo procesadores. Y como hemos dicho se llaman ahora "cores". * Hilos por núcleo: Es un único núcleo que permite ejecutar mas de un Thread((Es como un proceso o programa en ejecución)). Pero para ello cada hilo debe compartir compartir las ALUs, las FPUs, etc. Lo único que no se comparte y que se duplica son los registros. Se llama la tecnología [[https://en.wikipedia.org/wiki/Simultaneous_multithreading|Simultaneous Multithreading]] pero Intel la llama "[[https://es.wikipedia.org/wiki/Hyper-Threading|Hyper-Threading]]". Una explicación en [[https://www.profesionalreview.com/2019/04/03/que-son-los-hilos-de-un-procesador/|Qué son los hilos de un procesador ? Diferencias con los núcleos]]. Aunque el Multithreading se basa en que un procesador puede estar haciendo cálculos con la ALU o con la FPU por lo que la otra unidad está ociosa. Por lo tanto si ejecuta a la vez instrucciones de dos hilos, puede estar a la vez ejecutando cosas en la ALU y en la FPU por lo que trabajaría el doble con el mismo hardware. Pero eso no sería así , en caso de que los dos hilos quieran hacer cálculos en la ALU o ambos en la FPU. Por lo que en una placa se pueden poner uno o mas procesadores, cada procesador tiene uno o mas núcleos y cada núcleo puede ejecutar uno o mas hilos. ==== La ley de Amdahl ==== La [[https://es.wikipedia.org/wiki/Ley_de_Amdahl|Ley de Amdahl]], dice que según lo paralelizable que sea un programa, hay un límite al Nº de núcleos que se necesitan. Es decir , que aunque se añadan mas núcleos no va a mejorar prácticamente el rendimiento. Por lo que que tener mas núcleos no significa que siempre un procesador sea mas rápido. {{:clase:asir:fhw:1eval:ley-amdahl.png|}} ===== Cache ===== La cache es como una pequeña memoria RAM que se encuentra dentro del procesador. La cache es fundamental en cualquier procesador ya que la RAM es demasiado lenta para enviar los datos y las instrucciones que necesita un procesador ya que el procesador funciona muy muy rápido en comparación con la RAM. La cache almacena las instrucciones y/o datos que mas usa la CPU y de esa forma no tiene que perder el tiempo en ir a buscarlo a la RAM. Hay de 3 tipos de caches: * L3: Es la cache que comparten todos los núcleos. Solo hay una en cada procesador. Es la de mayor capacidad pero la mas lenta. * L2: Es una cache privada para cada núcleo , pero está fuera del núcleo.Tiene una capacidad intermedia y una velocidad intermedia. * L1: Es una cache privada para cada núcleo , pero está dentro del núcleo. Es la de menor capacidad pero la mas rápida. Se divide en Cache de Datos y Cache de instrucciones. Si solo nos dicen un único tamaño de la cache de un procesador, se están refiriendo a la cache L3. En la siguiente figura se puede ver un procesador con 4 cores y las caches {{:clase:asir:fhw:1eval:cache.jpg|}} Los círculos grandes son las caches L2 de cada core y los círculos pequeños son las caches L1 de cada core. ===== Frecuencia ===== Otra característica importante del procesador en la Frecuencia a la que funciona, que se mide en GHz. Es decir la velocidad a la que ejecuta cada instrucción Es importante destacar que no se puede comparar directamente la frecuencia de dos procesadores con microarquitectura distinta. Aunque uno vaya mas rápido que el otro (a mayor frecuencia) no significa que vaya mas rápido.Eso es así ya que por ejemplo la FPU de un proceesador a 2,2 Ghz podría ser mucho mas rápida que una la de otro procesador a 2,5 GHz ===== Socket ===== El socket (o Zócalo en castellano) es "el conector" donde se pone el procesador. El socket se encuentra en la placa base. Los procesadores están diseñador para una forma de socket en concreto. Varios modelos de procesadores pueden diseñarse para el mismo modelo de Socket. Pero lo contrario no es cierto. Además los Sockets entre fabricantes suelen ser incompatibles. En el siguiente artículo se pueden ver para cada procesador el socket que usa: [[https://www.tomshardware.com/reviews/cpu-socket-definition,5758.html|What Is a CPU Socket? A Basic Definition]] {{socket-cpu.png|}} Un Socket al fin y al cabo es como un enchufe y un conector pero con muchísimos "pines". Dependiendo del tipo de Socket los "pines" pueden estar en la placa base o en el procesador. * Socket PGA: Tiene los pines en el procesador * Socket LGA: Tiene los pines en la placa base La tendencia es a que se use LGA ya que permite mas densidad de pines. Actualmente (2021) AMD usa PGA e Intel PGA. Mas información en [[https://hardzone.es/reportajes/comparativas/socket-pga-lga-placa-base/|¿Qué tipo de socket es mejor a la hora de comprar tu placa base?]]. ===== Ejercicios ===== ==== Ejercicio 1 ==== Busca un procesador Intel en internet he indica: * Modelo * ISA y tipo (CISC o RISC) * Microarquitectura * Frecuencia * Nº de Núcleos * Nº de Hilos que se ejecutan por núcleo * Nº de Hilos que se ejecutan en total * Si soporta "Simultaneous Multithreading" * Modelo del Socket * Tamaño de la caché * L3 * L2 * L1 * Datos * Instrucciones * Precio ==== Ejercicio 2 ==== Busca un procesador AMD en internet he indica: * Modelo * ISA y tipo (CISC o RISC) * Microarquitectura * Frecuencia * Nº de Núcleos * Nº de Hilos que se ejecutan por núcleo * Nº de Hilos que se ejecutan en total * Si soporta "Simultaneous Multithreading" * Modelo del Socket * Tamaño de la caché * L3 * L2 * L1 * Datos * Instrucciones * Precio ==== Ejercicio 3 ==== Escribe un programa en ensamblado para el Z-80 que sume el valor de las posiciones de memoria 68A3 y DDF2 y deje el resultado en la posición de memoria ABCD. Indica el código máquina de dicho programa. ==== Ejercicio 4 ==== Si un programa funciona en un procesador de Sansung con ISA ARMv8, ¿funcionará dicho programa con un procesador Qualcomm cuya ISA es ARMv8? Es decir , si funcionará con dos procesadores de marcas distintas. ¿Explica porque? ==== Ejercicio 5 ==== Rellena las siguientes tablas. ^ Consola ^ Modelo del Procesador ^ ISA ^ CISC o RISC ^ | Xbox Original | | | | | Xbox 360 | | | | | Xbox One | | | | | Xbox Series X | | | | ^ Consola ^ Modelo del Procesador ^ ISA ^ CISC o RISC ^ | PlayStation | | | | | PlayStation 2 | | | | | PlayStation 3 | | | | | PlayStation 4 | | | | | PlayStation 5 | | | | ==== Ejercicio 6 ==== Indica para las siguientes ISA de ARM si son ISAs de 32 bits o 64 bits: * ARMv6 * ARMv7 * ARMv8 Y indica también la máxima RAM a la que puede acceder cada uno de ellos. ==== Ejercicio 7 ==== En la página de descarga de [[https://www.oracle.com/es/java/technologies/javase/javase-jdk8-downloads.html|Java del JDK 8]] y de [[https://www.oracle.com/java/technologies/javase/jdk14-archive-downloads.html|Java del JDK 14]], indica para que ISA's está disponibles cada una de las versiones.