====== 03. Procesadores ====== ===== Procesador ===== 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. Esas instrucciones son los "números" que hemos dicho que se leen de la RAM y que cada "número" significa una instrucción distinta. 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 o Intel 64)| AMD | PC con mas de 4 GB de RAM | | ARMv7 | ARM | Móviles,tablet,etc de hasta de 4 GB de RAM | | ARMv8 | 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 | | 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]] y [[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]] | 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, debe ser programado 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]] ===== 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. 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 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 guardan son los siguientes bytes de forma consecutiva: 3A F2 D3 47 3A F2 D4 88 32 F2 D5 ^ 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: {{:clase:daw:si:1eval: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: {{:clase:daw:si:1eval: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]] ^ Modelo de Procesador ^ ISA ^ Empresa que diseña la ISA ^ Empresa que diseña la 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 | Realmente no nos interesa mucho saber la empresa que fabrica el procesador.Aunque cuando decimos que un procesador es de la empresa "A", estamos diciendo que dicha empresa ha diseñado la microarquitectura de dicho procesador, aunque no haya creado ni la ISA ni lo haya finalmente fabricado. ===== Ejercicios ===== ==== Ejercicio 1 ==== Busca 2 procesadores de Intel y 2 de AMD e indica el tamaño de su cache. ==== Ejercicio 2 ==== Usando los conceptos aprendidos en clase, explica las diferencias entre una CPU y los siguientes tipos de procesadores: * GPU * iGPU * APU * IPU ==== 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 ==== Busca la ISA que van a usarse en los procesadores de las nuevas consolas de Sony y Microsoft ==== Ejercicio 6 ==== La FPU es una de las partes mas importantes de un procesador ya que determina mucho su velocidad, por ello las CPUs actuales suelen llevar varias FPUs y además de que en cada microarquitectura se mejora su velocidad. Lee el siguiente artículo de Linus Torvalds (el creador de Linux): [[https://www.linuxadictos.com/linus-torvalds-desea-muerte-dolorosa-avx-512-intel.html|Linus Torvalds le desea una muerte dolorosa a AVX-512 de Intel]] Y usando los conceptos que hemos visto en este tema explica que es "AVX-512" y que opina de las FPUs ==== Ejercicio 7 ==== Lee el siguiente artículo [[https://www.linuxadictos.com/linux-5-4-cesa-soporte-para-la-arquitectura-ia-64.html|Linux 5.4 cesa soporte para la arquitectura IA-64]] y usando los conceptos que hemos visto en este tema, explica de que está hablando. ==== Ejercicio 8 ==== 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 9 ==== 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 combinación de ISA y Sistemas operativos están disponibles cada una de las versiones.