Módulo I (143 pags)

Estructura interna del procesador y buses de interconerconexión

  1. Introducción.
  2. El funcionamiento de un computador.
  3. El bus como estructura de interconexión.

Módulo II (84 pags)

Unidad Aritmético Lógica

  1. Estructura de una ALU de enteros
  2. Números en coma flotante: Representación IEEE754
  3. Números en coma flotante: Operaciones

Módulo III (71 pags)

Unidad de memoria

  1. Organización física de la unidad de memoria
  2. Tipos de memorias
  3. Memoria caché
  4. Memoria virtual

Módulo V

Unidad de Control

  1. Organización y funcionamiento de la UC
  2. La unidad de control cableada
  3. La unidad de control microporgramada
2

El funcionamiento de un computador

Instrucciones y juego de instrucciones

(75 páginas)

1. Ciclo de instrucción

Para ejecutar instrucciones miramos si hay instrucciones disponibles. Va a una dirección de memoria concreta (Seguramente la 0) y cogerá la primera instrucción que haya allí. Acto seguido, existen dos ciclos. Dado que las instrucciones (Según la arquitectura de Von Neuman) están en memoria, en el primero, es donde se va a buscar esa instrucción, y en el otro ejecutamos dicha instrucción.

El esquema podría simplificarse si la única funcion de un computador fuera ejecutar instrucciones y sería todo lo que necesitaría un computador, independientemente del cinclo de interupción, pero un computador tambien tienen E/S, y se comunican con el computador dentro del programa, que llegan al procesardor dentro del programa.

Una interrupción detiene el flujo normal de la ejecución de instruccion.

2. Descripción interna del procesador

2.1. La memoria principal

La memoria podemos definirla como una caja compuesta de otras cajas más pequeñas denominadas palabras de memoria. La memoria dispone de un espacio de direcciones, compuesto de 2ᵐ palabras diferentes, cada una de ellas de n bits.

Una dirección utilizada para designar una localización de memoria ocupa una palabra.

2.2. Los buses

Son los hilos troncales que controlan todo. Supongamos que tenemos un único bus (normalmente llamado Bus del sistema), de forma simplificada se vería algo así.

Por el bus tenemos que pasar distintos tipos de información

Bus de Direcciones, Nos sirven para determinar con qué queremos comunicarnos (donde está el dato que queremos, o bien leer o bien escribir), puede ser una dirección de un dispositivo de entrada salida, etc
Bus de Datos, La información que se va a comunicar a través del bus
Bus de Control, señales que permiten que el bus funcione adecuadamente

Los buses no tienen por qué ser medios físicos diferentes, podemos compartir las mismas líneas para los buses de información.

2.3. El camino de datos

Subrutina: Es un fragmento de código que tiene una entrada y una salida y a la que se le puede pasar una serie de parámetros, que puede devolver o no un valor, creadas para los casos en que se tenían programas enormes y había partes que se repetía. De esta manera se guardaba el mismo código una vez, y se llamaba a este varias veces con distintos parámetros.

¿Los registros que ve el programador a bajo nivel pertenecen a la arquitectura de máquina, o pertenecen a la microarquitectura/estructura?

Los registros que ve el programador pertenecen a la arquitectura. Pertenecería tambien a la estructura dependiendo de aquellos casos donde los registros arquitecturales tienen un reflejo de la estructura, un caso donde la caja física de registro tiene una correspondencia 1 a 1. Mismo nombre de regsistro. Sin embargo, hay máquinas donde no existe esa correspondencia, porque los registros aquitecturales se mapean/se ven correspondidos no por un registro físico sino, por uno dentro de un banco de registros.

¿Si el MAR fuer ade 2 bits? ¿A cuántas palabras de memoria diferentes podría acceder?

2² = 4 palabras. No podría acceder a palabras que estuvieran más allá de la posición 0, 1, 2 y 3.

3. Relación del camino de datos y ciclo de instrucción

-.

4. Otras aqrquitecturas: Harvard

Se mantiene el hecho de que el procesador esté almacenado en la memoria. La diferencia con Von Neumann es que se separa la memoria de instrucciones de la memoria de datos.

4.1 Ventajas

4.2 Desventajas

Para que el modelo funcione hay que ser capaz de aprovechar las dos memorias, entonces hay que asegurarse que el ritmo de uso de esta estructuras es el adecuado y está bien equilibrado, si no, el coste que se ha pagado por esa memoria no me va a revertir, entonces implica un esfuerzo para asegurarse que se usan correctamente las dos memorias en paralelo aprovechándose al máximo, sería gastar un sobrecoste en vano.

4.3 Aplicaciones

Los caché son una memoria que se integra en el procesador que trata de acceder a la memoria principal copiando partes de ella. Sabiendo esto podriamos considerar máquinas modernas hechas con Harvard, aunque no sea usual.

Se usa sobre todo en microcontroladores, procesadores digitales de señal, etc. Y normalmente, lo que se hace cuando hablamos de estructuras diferentes, por ejemplo, la memoria de instrucciones, como suele ser dispositivos de propósito específico nos encontramos con que ni siquiera es modificable. En estos casos podríamos hacer una serie de optimizaciones que no s epodrían hacer en el modelo Von Neumann.

¿En un procesador con caché separada para datos e instrucciones pero una única memoria principal seguiría siendo Von Neumann o deberíamos considerarlo una arquitectura Harvard?

No podríamos considerarla Harvard, porque para ello, tendrían que ser memorias principales separadas, una destinada a los datos y otra a las onstrucciones.

5. Instrucciones

Una instrucción es una acción elemental (atómico e indivisible) que puedes encontrar en un computador, o dicho de otro modo: Un requerimiento para realizar una determinada acción. Las instrucciones son indivisibles sólo desde el punto de vista del programador.

En general hay una correspondencia 1 a 1. Aunque, muchos ensambladores permiten al programador hacer ciertos atajos que después de procesarse se transforman de otra manera.

¿Son muy diferentes los repertorios de instrucciones de diferentes computadores?

No son muy diferentes, es decir, no vas a encontrar un repertorio demasiado distinto en un dispositivo u otro. Pueden no ser iguales de manera exacta pero pero siempre tendrán muchas cosas en comñun (ADD o algo parecido, un MOV o algo parecido, habrá registros, direcciones de memoria), lo que se requiere de un computador va a ser siempre lo mismo en una máquina u otra.

5.1. Características

Las codificaciones no pueden ser ambiguas, en el diseño de las instrucciones se debe asignar una codificación bien definida y única para cada instrucción, esto es lo que se conoce como opcode. Esto es el identificador de la intrucción, pero además, contiene detalles de como están codificados los operandos con los que fuera a trabajar dicha instrucción.

5.2. Estructura de la instrucción

La instrucción realiza una función definida, documentada por el fabricante.

Una instrucción no puede ser ambigua (su codificación debe estar bien definidia, y además, debe tener toda la información necesaria para su ejecución:

Se pueden categorizar las instrucciones de varias formas (Clasificación de los repertorios)

M. de 3 direcciones: ADD R1, R2, R3 (R1  <- R2  + R3)
M. de 2 direcciones: ADD R1, R2     (R1  <- R2  + R1)
M. de 1 dirección  : ADD R1         (ACC <- ACC + R1)
M. de 0 direcciones: ADD            (<tope de pila> <- <tope> + <tope-1>)
Arquitectura registro-registro (0/3 operandos de memoria)
Arquitectura registro-memoria (1/2 operandos de memoria)
Arquitectura memoria-memoria (2/2 o 3/3 operandos de memoria)
Fija: Se dedica un numero finito y determinado a un juego de instrucciones
Variable: Permiten añadir dinamicmente más instrucciones. Un opcode es prefijo de otro.

¿Si tengo un repertorio grande de instrucciones, que tenga 8 operaciones cuántos bits necesito para codificar ese repertorio?

8 = 2³, por tanto encesitaríamos 3 bits.

5.3. Optimizando el juego de instrucciones

Condiciones deseables de una codificación. Las dimensiones en las que se puede en focar para optimizar el jeugo de instrucciones es.

¿Son mejores las instrucciones cortas o largas?

Que sean cortas hace que sean más rapidas de leer, sencillas de procesar/codificar, ocupan menos memoria. Las largas facilitan el trabajo del programador, ya que con menos pasos podría hacer lo mismo.

5.4. Tipos

6. Técnicas de codificación del opcode con longitud variable

En ambas codificaciones conocidas, ningún opcode puede ser prefijo de otro.

6.1. Codificación por expansión

Queremos construir un repertorio con las siguientes características:

15 instrucciones de 6 operandos
14 instrucciones de 2 operandos
31 instrucciones de 1 operando
16 instrucciones de 0 operandos

Tenemos:

16 registros, y sólo operamos con los registros en las instrucciones (4 bits por operando)

Arranco desde el opcode (0000) hasta 15-1 (1110)

(15 instrucciones de 3 operandos)
opde OP1  OP2  OP3
————————————————————
0000 XXXX YYYY ZZZZ
0001
...                   (+14)
1110 

Arranco desde el opcode (1111 0000) hasta 14-1 (… 1101)

(14 instrucciones de 2 operandos)
opde      OP1  OP2  
———————————————————
1111 0000 YYYY ZZZZ
...                   (+13)
1111 1101

Arranco desde el opcode (1111 1110 0000) hasta 31-1 (16+14)

(31 instrucciones de 1 operando)
opde           OP1  
———————————————————
1111 1110 0000 ZZZZ
...                   (+16)
1111 1110 1111 ZZZZ
1111 1111 0000 ZZZZ   (+1)
...                   (+13)
1111 1111 1110 ZZZZ

Arranco desde el opcode (1111 1111 1111 0000) hasta 16-1 (1111)

(16 instrucciones de 0 operando)
opde            
———————————————————
1111 1111 1111 0000
...                   (+16)
1111 1110 1111 1111

6.2. Codificación Huffman

Tener opcodes más cortos abarata en tiempo el coste la decodificación de los opcodes, por esto se utiliza la codificación Huffman, se asigna opcodes más cortos a instrucciones más frecuentes. A la larga se consigue que sea más rápido decodiifcar las instrucciones y aparte, así, los programas ocupan menos en memoria.

Queremos construir un repertorio de 8 instrucciones cada una con las siguientes frecuencias relativas:

Instrucción frecuencia
LOAD 0,25
STORE 0,25
ADD 0,125
AND 0,125
NOT 0,0625
RSHIFT 0,0625
JUMP 0,0625
HALT 0,0625
  1. Construir la tabla de instrucciones en orden decreciente por frecuencia
  2. Sumar las dos ultimas posiciones y reordenar el resultado sin perder de vista de dónde vino (repetir hasta tener 2 elementos)
  1. Comenzar la marcha atrás. (Repetir hasta volver al principio)
    • Si una frecuencia venía de la suma de otros dos, añadir un nuevo bit a la codificación de la instrucción
    • Si no, dejar el código como está

7. Modos de direccionamiento

Indica el procedimiento por el que yo puedo acceder a un operando. Se define como la accion que utilizamos para especificar el modo de uso de un operando en una instrucción, y además, define la forma de cómo accedemos a los operandos, es decir la descripción del método para llegar a dicho operando.

Permiten utilizar las codificaciones más sintéticas que oucupen menos espacio para acceder a un mayor espacio de direcciones y simplificar el acceso a estructiras complejas de memoria.

7.1. Notación

A, B...  : Campo de dirección de memoria en la instrucción (dirección contenida en la propia instrucción).
Rₓ       : Campo de "dirección" de registro en la instrucción
EA       : Dirección efectiva
D, #Inm  : Constante inmediata
(x)      : Contenido de la posición en memoria x o indirección. El simil de los punteros a bajo nivel.
[]       : Indexación.

7.2. Direccionamiento inmediato

El operando está en la propia inrucción.

Rápido Poco rango de bits para representar los operandos.

7.3. Direccionamiento directo de registro y de memoria

Un campo de direcciones (registros o memoria) contiene la dirección del operando.

Rápido, el campo de dirección es múy pequeño El espacio direccionable está limitado al número de registros.
No conviene abusar a menos que vayan a usarse operaciones sobre el mismo registro.
Facilidad de implementación. Espacio de direcciones disponible Es lento y, sólo se puede acceder al espacio de direcciones que nos quepa en el nº de bits del operando.

8.4. Direccionamiento indirecto de registro y de memoria

Existe para poder dotar de mayor flexibildad al programa ante una perspectiva en la que solo se podían manejar variables globales o estáticas. Es más eficiene el direccionamiento indirecto de registro porque el de memoria implica acceder dos veces a memoria, y acceder a memoria resulta más costoso que obtener la dirección del dato desde un registro que ya se encuentra en la CPU, (menos caminoa recorrer, menos costo).

La dirección de memoria se trata como un dato, lo que permite operar con ella.
Permite el paso por referencia a subrutinas
Más lento por la indirección
Misma ventaja que la de registro. pero aporta un mayor espacio de direccionamiento. Más lento aún por la doble carga en memoria.

7.5. Direccionamiento relativo o con desplazamiento

Permite reubicación de programas.

7.5.1 Relativo a Program Counter

La dirección base es el PC y el desplazamiento es una constante en cpl2 (con signo). Se trata de un salto relativo a la dirección del programa.

Rápido Muy limitado

7.5.1 Relativo a Registro base

La dirección base la contiene un Registro y el desplazamiento es una constante (sin signo). Su filosofía es como el acceso a la posición de un array.

Permite acceder a estructuras que se encuentran en posiciones no fijas en memoria Más lento, suma y meoria.

7.5.2 Indexado

La dirección base la contiene una dirección de Memoria y el desplazamiento es un Registro que hace de índice. Como el desplazamiento es mutable, puede entenderse como los índices de un loop, que vayan incrementando en un recorrido.

Permite acceder a elementos diferentes de una estructura fija en memoria como hace un array Lento y ocupa más que el anterior

7.6. Direccionamiento de pila

Direccionamiento implicito.

Rápido. Permite acceder a elementos en una pila.
Permite instrucciones muy compactas.
En máquinas especiales suele estar muy optimizado
Muy limitado

8. Computadores

8.1. Rendimeinto de un computador

¿Qué hace un computador mejor que otro?

La velocidad, la eficiencia, el número de operaciones por minuto, el throughput/rendimiento, capacidad (más memoria, más disco duro), coste, consumo energético, tamaño robuste, durabilidad…

8.2. Tipos de computadores

Computador Coste Consumo energético Rendimiento computacional Tamaño
Microcontrolador ▉▉ ▉▉▉ ▉▉▉
SoC ▉▉▎ ▉▉▎ ▉▉▎ ▉▉
PC ▉▉▉
Portátil ▉▉ ▉▉▎ ▉▉▎
Servidor ▉▉▉ ▉▉▉
Máquina de cómputo científico ▉▉ ▉▉▉▉

9. Mejoras del rendimiento computacional

Debido a que los límites de la explotación del rendimiento en el hardware está llegando a su tope, la mejor forma de sacar partido de éstos es el de conseguir ejecutar procesos en paralelo (paralelismo)

Fynn: Por cada flujo podemos tener un único flujo (S) o múltiples (M) donde el programa se puede resolver en varios flujos que intercambian información entre sí, y ambos pueden ser de instrucciones (I) o de datos (D)..

El flujo de datos/información se refiere acerca del movimiento que tienen los datos en el sistema. Pueden representar a los distintos hilos de procesamiento, o las tareas que se ejecutan en paralelo si hay varios flujos ejecutándose a la vez.

Rendiemento = Nºintrucciones/programa * CPI * tiempo

13.1. Clasificación de Flynn

13.2. Paralelismo potencial en aplicaciones

13.3. Paralelismo en el hardware

14 Paralelismo a nivel de instrucción (MI/ILP)

¿En qué cosas debería fijarme para explotar el paralelismo a nivel de instrucción?

14.1. Segmentación

Es una forma de explotar el paralelismo en un computador. Funciona similar a una cadena de montaje

¿La segmentación reduce el tiempo de ejecución de una instrucción?

No lo reduce, normalmente lo aumenta debido a las etapas más lentas. No mejora el tiempo de ejecución de la instrucción, mejora la medida de throughput (rendimiento) que corresponde al número de instrucciones que se sacan por ciclo.

Dicho de otro modo. No está pensado para mejorar el tiempo de una instrucción, sino para mejorar el tiempo de muchas instrucciones.

¿De qué otra forma se puede mejorar más aún el rendimiento de ILP, más allá de la segementación?

Lanzar más de una instrucción por ciclo, se duplica/aumenta, así la pipeline (tecnica de visión múltiple de instrucciones)

Para lanzar más de una instrucción por ciclo hay que hacer una planificación para determinar las instrucciones que se pueden lanzar a la vez.

Según la aproximación más cercana al Hardware, sería éste quien se encargaría de decidir en cada momento si un numero N de instrucciones se pueden ejecutar a la vez o no, mirando si hay dependencias en las instrucciones, si el recurso está disponible para ejecutar. SU ejemplo serían las máquinas superescalares.

Según la aproximación cercana al software, es el compilador el que decide. Analiza el código y estáticamente planifica qué instrucción se puede ejecutar creando paquetes de instrucciones.

15. Paralelismo a nivel de hilo/thread (MI/TLP)

Partir el núcleo en núcleos más pequeños. Dividir la ejecución, planificicarlo para que la ejeción funcione en múltiples hilos.

15.1. Multithreading por bloque/reparto de tiempo

Se pueden utilizar sobre un único procesador. Consiste en intercalar la ejecuciónd e hilos. Tiene dos vertientes (Cada hilo tendrá su estado arquitectural):

15.2. Simultaneus Multithreading (SMT)

Los recursos internos estarían duplicados/replicados (ALU, decodificadores..). Estados de arranque. Ejecución paralela de varios hilos

16. Paralelismo a nivel de datos (MD/DLP)

Cada dato recibe la acción de la instriccón. Muchas arquitecturas lo incluyen, como intel (MMX, SSE, AVX..), trabajan con datos vectoriales, lo que suponen registrso de 128 bits como si fueran vectores.

Existen otros modelos como las GPU, no trabajan con datos vectoriales, sino que se trabaja con muchos núcleos, lo que supone una tendencia a trabajar como el TLP. Lo que, si los nucleos tienen restricciones para que mantengan un sincronismo y se enfoquen en los datos del mismo programa, estaría funcionando a nivel de MD.