CPU Segmentada o pipeline
En computación, una tubería (pipeline o cauce), la definimos como una cadena de procesos conectados de tal forma que la salida de cada elemento de la cadena constituye la entrada del siguiente, permitiéndose la sincronización de los procesos en ejecución. Se suele utilizar un búffer de datos, como veremos, para optimizar este proceso con accesos a la memoria previos, agilizando el suministro de datos al procesador.
Sumario
- Consideraciones previas
- Concepto básico de funcionamiento de pipeline
- Funcionamiento de pipeline
Consideraciones previas
Depende de variados factores la velocidad de ejecución de los programas. Parece obvio que la forma de aumentar esta velocidad consiste en hacer más rápidos los circuitos con que se construyen los procesadores y la memoria principal. No obstante, mejorar el diseño supone un elevado coste y además, el límite de la velocidad lo impone la tecnología disponible.
Para aumentar la velocidad del procesador, teniendo en cuenta que fabricar circuitos más rápidos tiene un alto coste, tenemos dos soluciones:
- A nivel de procesador (Paralelismo)
- A nivel de instrucción (Pipelining)
Una posibilidad es la utilización de múltiples procesadores que ejecuten simultáneamente varias instrucciones, de manera que, con esta organización del hardware, se pueda ejecutar más de una instrucción simultáneamente. No obstante, las arquitecturas con múltiples procesadores suponen un alto coste y solo suelen utilizarse en equipos con muy altas prestaciones.
Otra opción, es ejecutar varias instrucciones simultáneamente con una única CPU. A esto último se le denomina segmentación, encadenamiento o pipelining. Con esta técnica se consigue una muy buena mejora del rendimiento y a un coste asequible. Por esto, es muy común su utilización en muchos procesadores.
Concepto básico de funcionamiento de pipeline
El funcionamiento del proceso en pipeline es comparable al utilizado en una cadena de montaje. El nombre pipeline, o tubería, se basa en el hecho de que como en una tubería, en la entrada se aceptan nuevos elementos, que en un procesador serían las instrucciones, antes de que, los previamente aceptados, salgan por la salida.
Veámoslo con un ejemplo de una cadena de montaje. Nos situamos en un almacén de distribución donde tenemos que empaquetar los pedidos para su posterior distribución. Este proceso completo consiste en los siguientes pasos:
- – Poner una caja vacía en la mesa.
- – Meter un producto en la caja.
- – Cerrar y precintar la caja.
- – Poner una etiqueta en la caja.
- – Almacenar la caja para su distribución.
Si un solo operario realiza cada una de estas operaciones en 10 segundos, es evidente que se tarda 50 segundos en completar el proceso de empaquetado, etiquetado y almacenado.
Funcionamiento
Pero supongamos que disponemos de una cadena de empaquetado de pedidos en la que trabajan cinco operarios, especializados cada uno en una tarea distinta.
El primer operario pone la caja-1 en la cinta transportadora, y ésta avanza hasta que la caja-1 llega donde está el segundo operario, que introduce un disco duro dentro de la caja-1, simultáneamente el primer operario pone otra caja-2 en la cinta.
La caja-1 sigue avanzando hasta el tercer operario, que la cierra y la precinta, al mismo tiempo que el segundo operario mete otro disco duro en la caja-2 y el primer operario pone otra caja-3 en la cinta.
La caja-1 sigue su camino en la cinta pasando por el cuarto operario, que etiqueta la caja, hasta llegar al quinto operario, que la retira de la cinta y la lleva al almacén de distribución.
Cuando el quinto operario retira la caja de la cinta transportadora, hay cuatro cajas más en la cinta. Si cada una de estas fases de empaquetado se realiza en 10 segundos, cada 10 segundos saldrá una nueva caja precintada y etiquetada para su distribución, en lugar de cada 50 segundos que se tardaba cuando no había cadena de empaquetado.
A partir de este momento, tendremos 10 cajas terminadas en 100 segundos, mientras que cuando se tenía un solo operario se tardaba 500 segundos.
No obstante, tenemos que tener claro que, aunque ahora sale una nueva caja terminada cada 10 segundos, la preparación completa de cada caja sigue requiriendo de 50 segundos, igual que cuando había un solo operario preparando las cajas.
Como opera el pipeline
En los sistemas operativos multitaréa, las tuberías están implementadas de forma muy eficiente, iniciando todos los procesos al mismo tiempo, y atendiendo automáticamente los requerimientos de lectura de datos para cada proceso, cuando los datos son escritos por el proceso anterior. De este modo, el planificador a corto plazo minimizará los tiempos muertos, dando el tiempo de CPU a cada proceso a medida que puedan ejecutarse.
La mayoría de los sistemas operativos implementan las tuberías usando búfferes, lo que permite al proceso proveedor, generar más datos de lo que el proceso consumidor puede atender inmediatamente, mejorando el rendimiento.
En la ejecución en serie de instrucciones, la primera instrucción debe ejecutarse completamente antes de comenzar la segunda, y ésta debe completarse a su vez antes de que comience la tercera. De esta manera, si las instrucciones son sumas, por ejemplo, se obtiene un resultado cada cinco ciclos ( en t1 , en t2 en t3 , etc).
Básicamente podemos establecer que se requieren 2 pasos para ejecutar una instrucción en la CPU
- F: Extracción de la instrucción desde memoria (Fase de búsqueda de la instrucción).
- E: Ejecución de la instrucción (Fase de ejecución de la instrucción).
Puedes ver más detalladamente este proceso en «Búsqueda y ejecución de una instrucción a partir de la arquitectura Von Neumann paso a paso«.
Fase de ejecución
Si se tiene en cuenta que durante la fase de ejecución hay momentos en los que no se accede a memoria principal, se puede aprovechar para buscar instrucciones por adelantado y guardarlas en un buffer temporal, todo ello en paralelo con la ejecución de la instrucción en curso.
Con ello se consigue que al terminar de ejecutar dicha instrucción, se puede cargar la siguiente instrucción directamente desde el buffer sin tener que esperar a traerla de la memoria principal.
Mientras en la segunda etapa se está ejecutando una instrucción, la primera etapa aprovecha los ciclos en los que la segunda etapa no accede a memoria, para leer la siguiente instrucción y guardarla en el buffer.
Cuando la segunda etapa acabe la ejecución y vacíe el buffer, la primera etapa puede volver a leer una nueva instrucción de memoria. Con estas dos etapas de búsqueda y ejecución de instrucciones, parece que la velocidad de ejecución de instrucciones por segundo (rendimiento) se duplica. Esto es así, simplemente porque el número de etapas dice cuántas cosas se están haciendo simultáneamente, y claro, cuantas más mejor.
Y si nos fijamos en el ejemplo de la línea de empaquetado de productos, antes vista, tenemos que su velocidad de cajas terminadas por minuto se multiplica por cinco al establecerse una cadena de empaquetado de cinco etapas.
División en etapas
Según lo que acabamos de ver, parece que interesa dividir las fases de ejecución de las instrucciones en más etapas, para así obtener un mayor rendimiento en la ejecución.
La ejecución de una instrucción podría descomponerse en las siguientes 5 etapas:
- F: Búsqueda de la instrucción
- D: Decodificación de la instrucción
- O: Extracción y cálculo de los operandos
- E: Ejecución (en la ALU)
- W: Escritura del resultado (write)
Si suponemos que la duración de un ciclo de reloj es igual a la duración de cada una de estas pequeñas etapas, podemos decir, en principio, que con la técnica del pipelining se consigue que a cada ciclo de reloj finalice una instrucción, o lo que es lo mismo, una velocidad de instrucción por ciclo.
Según esto, parece que cuanto mayor sea el número de etapas de un pipeline, mayor es la velocidad de ejecución.
Sin embargo, el diseño para gestionar y optimizar los buffers intermedios y las dependencias entre las etapas del pipeline crece enormemente con el número de etapas, hasta el punto de llegar a ser muy complejo y costoso.
Por tanto podemos concluir que la técnica de la segmentación o «pipelining» mejora el rendimiento, pero no el tiempo de ejecución de cada instrucción.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.
Gracias Javier. Muy didáctico y fácil de comprender
Gracias por el comentario Barto.