Formas de Ejecutar Instrucciones en Microprocesador

Instrucciones en el Microprocesador:


  • Unidad Aritmética/Lógica (ALU) que desarrolla operaciones aritméticas (por ejemplo, suma, resta, multiplicación y división) y lógicas (por ejemplo, mayor que, menor que, igual que) requeridas para procesar las instrucciones.
  • La memoria caché, una memoria especial de alta-velocidad que almacena los datos usados más recientemente, para acelerar el proceso de ejecución de instrucciones. 
  • La tasa a la cual se procesan las instrucciones es controlada por un reloj interno, también conocido como el reloj del sistema.
  • Un ciclo de instrucción no necesariamente corresponde a la ejecución de un número fijo de instrucciones. En algunas ocasiones se necesitan dos ciclos o más para ejecutar una instrucción.
  • El número de instrucciones completadas es independiente del número de ciclos usados. 
  • Algunas veces las comparaciones entre computadoras se hacen basándose en el número de instrucciones por segundo (IPS) en lugar del tiempo de ciclo; ésta medida depende tanto del número de ciclos por segundo como de la mezcla de instrucciones.


Ciclo de Instrucción:

Se conoce como set de instrucciones al conjunto de instrucciones que es capaz de entender y ejecutar un microprocesador. Un ciclo de instrucción, también llamado fetch and execute (búsqueda y ejecución) es el período que tarda un microprocesador en ejecutar una instrucción. Se divide en dos etapas: Ciclo de búsqueda y Ciclo de ejecución

Las instrucciones se clasifican según su función en:

  • Instrucciones de transferencia de datos. Estas instrucciones mueven datos (que se consideran elementos de entrada/salida) desde la memoria hacia los registros internos del microprocesador, y viceversa. También se usan para pasar datos de un registro a otro del microprocesador. Existen algunas instrucciones que permiten mover no sólo un dato, sino un conjunto de hasta 64 KBytes con una sola instrucción.

  • Instrucciones de cálculo. Son instrucciones destinadas a ejecutar ciertas operaciones aritméticas, como por ejemplo sumar, restar, multiplicar o dividir, o ciertas operaciones lógicas, como por ejemplo AND, OR, así como desplazamiento y rotación de bits.

  • Instrucciones de transferencia del control del programa. Permiten romper la secuencia lineal del programa y saltar a otro punto del mismo. Pueden equivaler a la instrucción GOTO que traen muchos lenguajes de programación.

  • Instrucciones de control. Son instrucciones especiales o de control que actúan sobre el propio microprocesador. Permiten acceder a diversas funciones, como por ejemplo activar o desactivar las interrupciones, pasar órdenes al coprocesador matemático, detener la actividad del microprocesador hasta que se produzca una interrupción, etc.



Ciclo de búsqueda

  • Búsqueda de la instrucción:

Lo primero que realiza el microprocesador en un ciclo de instrucción, es buscar la instrucción en la
        memoria principal (RAM). El registro apuntador de instrucciones, tiene almacenada la dirección de
        la próxima instrucción a ejecutar.

Cuando la instrucción fue hallada, el microprocesador pasa la instrucción de la memoria principal a
        través del bus de datos al Registro de Datos de Memoria (MDR). A continuación, lo registrado
        allí es colocado en el Registro de Instrucción Actual (CIR), un circuito que guarda la instrucción
        temporalmente de manera que pueda ser decodificada y ejecutada.


  • Decodificación de la instrucción:

La segunda y última acción comprendida en el ciclo de búsqueda es decodificar la instrucción.
        El dato es enviado a una Unidad de Decodificación, que decodifica la instrucción que se va a ejecutar.
        Es decir, el decodificador traduce la instrucción para saber, justamente, qué instrucción es.


Ciclo de ejecución

Ejecución de la instrucción:      

Una vez que la unidad de decodificación sabe cuál es el significado de la instrucción leída de memoria,
se lo comunica a la Unidad de Ejecución. Esta unidad será la encargada de consumar la ejecución y para ello activará las señales necesarias y en un orden determinado. Es decir, es la encargada de dar las órdenes necesarias a las diversas partes del microprocesador para poder ejecutar cada una de las instrucciones.

--> b

Ciclo de ejecución de instrucciones:

La ejecución de una instrucción de la máquina solo puede dividirse en una secuencia de operaciones individuales llamado el ciclo de ejecución de la instrucción. Antes de ejecutar un programa se carga en memoria. El puntero de la instrucción contiene la dirección de la siguiente instrucción. La cola de la instrucción contiene un grupo de instrucciones a punto de ser ejecutado.

La ejecución de las instrucciones se puede realizar en varias fases: fetch, decodificar, y ejecutar.

Fetch: Recuperar la instrucción de la cola de la instrucción y los incrementos de la puntero de instrucción (IP). El puntero de instrucción es también conocido como el contador de programa.

Decode(decodificar):Su función es decodificar la instrucción para determinar lo que la instrucción hace. Operandos de entrada de la instrucción se pasan a la unidad aritmética lógica (ALU), y las señales son enviadas a la ALU que indica la operación a realizar.

Fetchoperandos: Si la instrucción utiliza un insumo que se encuentra operando en la memoria, la unidad de control utiliza un operación de lectura para recuperar el operando y copiarla en los registros internos. Registros internos no son visible para programas de usuario.

Ejecutar: La ALU ejecuta la instrucción con los registros con nombre y los registros internos como operandos y envía el resultado a los registros de nombre y / o la memoria. Los indicadores de estado ALU proporcionan información sobre el estado del procesador.

Operando de salida: Si el operando de salida está en la memoria, la unidad de control utiliza una operación de escritura para almacenar los datos.


Tipos según la instrucción que maneja

Si un microprocesador es capaz de ejecutar muchas instrucciones en código máquina no es garantía de ser mejor que otro que ejecuta menos instrucciones. En la actualidad sucede todo lo contrario.

Si atendemos al número de ciclos de reloj que se necesitan para ejecutar las instrucciones en código máquina podemos encontrar dos tipos de microprocesadores:

CISC.-Computación con una colección de instrucciones compleja. Las instrucciones son ejecutadas haciendo uso de varios ciclos de reloj. Las instrucciones son interpretadas por un microprograma a través de la unidad de control. Es decir, cada instrucción "código máquina" está asociada a una serie de microinstrucciones dentro del microprocesador.

RISC.- Computación con una colección de instrucciones reducida. Son más rápidos y eficientes aunque los programas ejecutables son más largos. Una tarea simple puede requerir la ejecución de varias instrucciones. Cada instrucción es ejecutada en un ciclo de reloj, excepto las de cargar y guardar. También poseen otras características que los definen como el formato simple de instrucción. Es decir, todas ocupan un número de bits.

Lectura y ejecución de instrucciones

El procesador lee una instrucción de la memoria, al comienzo de cada Ciclo de instrucción. Se cuenta con un contador de programas (PC programcounter), que lleva la cuenta de cual es la próxima instrucción a leer.

Luego de leer cada instrucción el procesador incrementara el PC, de manera tal que la siguiente instrucción a leer será; la que se encuentra en la dirección inmediatamente superior de la memoria. La instrucción leída es cargada en el registro de instrucción (IR instuctionregister), que es un registro del procesador. El procesador interpreta la instrucción, la cual está en forma de código binario, que especifica la acción que el procesador llevará a cabo, y realizará la acción requerida.

 Pasos en la ejecución de una instrucción dentro del procesador:

  1. La unidad de interface con el bus lee la siguiente instrucción del programa y los datos asociados, que le llegan a través del FSB. 
  2. La unidad de decodificación traduce la instrucción y se la pasa a la unidad de control para que decida qué hacer con ella.
  3. Si la instrucción necesita ejecutar alguna operación matemática, se la pasa a la ALU.
  4. La ALU realiza la operación y deja el resultado en un registro.
  5. La unidad de control le pasa el resultado de la operación a la unidad de interfaz con el bus y le da la orden de guardarla en la memoria.
  6. La unidad de interfaz con el bus escribe en la memoria RAM  el resultado de la ejecución de la instrucción a través del FSB.
Este comportamiento se ejecuta de forma continua en un bucle hasta que se alcanza el final del 
        programa.


Formas de ejecución de instrucciones en el microprocesador
Ejecución fuera de orden

En arquitectura de computadores, la ejecución fuera de orden u OoOE (Out-of-OrderExecution) es un paradigma utilizado en la mayoría de los microprocesadores de alto rendimiento como forma de aprovechar los ciclos de instrucción que de otro modo serían desperdiciados produciéndose cierta demora de trabajo. Gran parte de los diseños modernos de CPU soportan la ejecución fuera de orden.

Ejecución fuera de orden - Ideas básicas

Procesadores en orden 

1.- Captura de la instrucción.
2.- Si los operandos de entrada están disponibles (en los registros por ejemplo), la instrucción es enviada a la correspondiente unidad funcional. Si alguno de ellos no lo está durante el ciclo de reloj actual (generalmente porque está siendo capturado desde memoria), el procesador inserta burbuja hasta poder utilizar el dato.
3.- La instrucción es ejecutada por la unidad funcional adecuada.
4.- La unidad funcional escribe los resultados en el archivo de registros.

Procesadores fuera de orden

1.- Captura de la instrucción.
2.- Envío de la instrucción a una cola (también llamada buffer o estación de reserva).
3.- La instrucción espera en cola hasta que los operandos de entrada estén disponibles, de manera que una instrucción más reciente puede abandonar el buffer antes que otra anterior si ya tiene los datos disponibles.
4.- La instrucción es enviada a la correspondiente unidad funcional, que la ejecuta.
5.- Se envía el resultado a cola.
6.- La instrucción en curso solamente puede escribir en el archivo de registros una vez que todas las anteriores a ella hayan escrito sus correspondientes resultados.

Ejecución fuera de orden 

La idea clave del procesamiento OoO consiste en permitir al procesador evitar ciertos tipos de burbuja que suceden cuando la información necesaria para realizar una operación no está disponible. Siguiendo los pasos antes explicados, el procesador OoO evita las burbujas comentadas en el paso 2 de la ejecución en orden cuando la instrucción no se puede completar a causa de la falta de datos.

Los procesadores OoO rellenan esos "huecos" de tiempo con instrucciones que sí están listas para ejecutarse para después reordenar los resultados y aparentar que fueron procesadas de manera normal.

La forma en que las instrucciones son ordenadas en el código original a ejecutar se conoce como orden de programa, mientras que el orden en que el procesador las maneja es el orden de datos, siendo aquel en que los datos van quedando disponibles para su captura desde los registros del procesador. Se necesita una circuitería bastante compleja para convertir un orden en otro y poder además mantener el orden lógico de la salida; el propio procesador ejecuta las instrucciones de forma aperentemente aleatoria.





Ejecución fuera de orden - Beneficios

Los beneficios del procesamiento OoO crecen a medida que se profundiza en la segmentación, así como con el crecimiento de la diferencia de velocidades entre la memoria principal (o memoria cache) y el procesador. En las máquinas modernas, el procesador funciona a velocidades mucho mayores que la memoria, de modo que mientras un procesador en orden pierde tiempo esperando por los datos, uno OoO ya habría procesado un gran número de instrucciones.

Superescalar
En un procesador superescalar, el procesador maneja más de una instrucción en cada etapa. El número máximo de instrucciones en una etapa concreta se denomina grado, así un procesador superescalar de grado 4 en lectura (fetch) es capaz de leer como máximo cuatro instrucciones por ciclo. El grado de la etapa de ejecución depende del número y del tipo de las unidades funcionales.
Un procesador superescalar es capaz de ejecutar más de una instrucción simultáneamente únicamente si las instrucciones no presentan algún tipo de dependencia (hazard). 


Super-threading

Es una forma de multithreading simultáneo, similar y anterior al HyperThreading de Intel.
Los computadores con soporte para dicha tecnología pueden ejecutar instrucciones de un hilo de ejecución (thread) distinto cada ciclo de reloj, de tal forma que los ciclos vacíos de uno de ellos pueden usarse para otro hilo. Esto es debido a que un hilo dado seguramente no mantendrá ocupadas todas las unidades de ejecución a la vez.

Algunas implementaciones más avanzadas de esta idea permiten a múltiples hilos ejecutarse en un mismo ciclo de reloj, usando diferentes unidades de ejecución, como las incorporadas en los procesadores superescalares.


Ejecución especulativa

En ciencias de la computación, la ejecución especulativa es la ejecución de código por parte del procesador que no tiene por qué ser necesaria a priori. En la programación funcional, suele usarse el término "evaluación especulativa".

La ejecución especulativa no es más que una optimización. Obviamente, sólo es útil cuando la ejecución previa requiere menos tiempo y espacio que el que requeriría la ejecución posterior, siendo este ahorro lo suficientemente importante como para compensar el esfuerzo gastado en caso de que el resultado de la operación nunca llegue a usarse.


VLIW
Del inglés Very Long Instruction Word.Esta arquitectura de CPU implementa una forma de paralelismo a nivel de instrucción. Es similar a las arquitecturas superescalares, ambas usan varias unidades funcionales (por ejemplo varias ALUs, varios multiplicadores, etc) para lograr ese paralelismo.
Los procesadores con arquitecturas VLIW se caracterizan, como su nombre indica, por tener juegos de instrucciones muy simples en cuanto a número de instrucciones diferentes, pero muy grandes en cuanto al tamaño de cada instrucción. Esto es así porque en cada instrucción se especifica el estado de todas y cada una de las unidades funcionales del sistema, con el objetivo de simplificar el diseño del hardware al dejar todo el trabajo de planificar el código en manos del programador/compilador, en oposición a un procesador superescalar, en el que es el hardware en tiempo de ejecución el que planifica las instrucciones.
       
Un microprocesador típico VLIW es el IA-64.


Ventajas:
  • Simplificación de la arquitectura hardware al no tener que planificar el código.
  • Menor potencia y consumo.
Inconvenientes:

Requiere compiladores mucho más complejos.

Cualquier mejora en la arquitectura hardware implica un cambio en el juego de instrucciones (compatibilidad hacia atrás nula).Aunque los inconvenientes hacen las arquitecturas VLIW poco adecuadas para la computación de propósito general, dichos inconvenientes son irrelevantes en la computación empotrada. El menor consumo y bajo coste del hardware los hace muy adecuados para dichos sistemas. Podemos encontrar VLIW en TVs HD, discos duros multimedia, reproductores bluray, etc.

Procesamiento de varias instrucciones

Son varias las técnicas que pueden utilizarse para ejecutar varias instrucciones a la vez.

1.- Acoplando varios microprocesadores a la placa.- Trabajan de forma coordinada y en paralelo.
2.- Procesador matricial.- Una unidad de control y varias UAL con sus registros asociados.
3.- Procesador de varias unidades funcionales.- Cada una de ellas hace algo: sumar, restar...
4.- Procesamiento escalonado (pipeline).- Similar a la cadena de montaje de coches. Las instrucciones avanzan por distintas zonas que van descodificando la instrucción hasta su total ejecución.

-->





1 comentario:

  1. Excelente trabajo, muy didáctico y muy bien presentado! Gracias por el esfuerzo.

    ResponderEliminar