13 – Organización Tubular

Hemos dicho que las únicas virtudes del computador son su enorme velocidad de ejecución de instrucciones y su enorme capacidad para almacenar información. Pues bien, el progreso en la organizacoión del computador ha consistido en aumentar ambas cosas, en logar procesadores cada vez más rápidos y memorias cada vez más grandes.

En cuanto a lograr porocesadores más rápidos, una de las técnicas universalmente usada hoy día es superponer las varias etapas en el ciclo de máquina: mientras se ejecuta una instrucción, se puede ir captando la siguiente. Es mas, Si el ciclo de ejecución tiene varios subciclos o etapas, la sobreposición de tareas puede ser aún mayor.

Este paralelismo a nivel de instrucción es lo que llamamos pipelining, que hemos traducido por «organización tubular» (algunos textos lo han traducido como «organización encausada»). No sería correcto decir «arquitectura tubular», o «arquitectura encausada», pues se trata de un detalle de organización del hardware que no afecta la interfaz con el programador.

La idea de superponer tareas es una tnécnica bien conocida en las líneas de ensamblaje. A lo largo de la línea hay un producto en proceso de ensamblado que va pasaando por diferentes estaciones, mientras más adelante en la línea más completo, más cerca de la forma final. En el embotellado de bebidas por ejemplo las estaciones o pasos pueden ser: llenado, tapado, sellado, etiquetado; cada estación se dedica a una tarea específica, sea manual o automatizada.

Pipeline en RISC-V

*gpt* Las etapas típicas en un pipeline de procesador incluyen la búsqueda de instrucciones, la decodificación de instrucciones, la ejecución de instrucciones, el acceso a memoria y la escritura de resultados. RISC-V ilustra muy bien estas ideas. Cada etapa se dedica a una tarea específica y las instrucciones se desplazan a través del pipeline, pasando de una etapa a la siguiente en cada ciclo de reloj.

*gpt* En un procesador RISC-V pipelined típico, se divide el proceso de ejecución de instrucciones en varias etapas secuenciales, cada una dedicada a una tarea específica. Estas etapas pueden incluir la búsqueda de instrucciones (IF), la decodificación de instrucciones (ID), la ejecución de instrucciones (EX), el acceso a memoria (MEM) y la escritura de resultados (WB). Cada etapa del pipeline se encarga de procesar una instrucción a la vez, pero a medida que las instrucciones avanzan a través del pipeline, múltiples instrucciones pueden estar en diferentes etapas de ejecución al mismo tiempo. Esto permite que se ejecuten varias instrucciones en paralelo y se logre un mejor rendimiento.

https://inst.eecs.berkeley.edu/~cs61c/sp20/pdfs/lectures/lec14.pdf

https://passlab.github.io/CSE564/notes/lecture09_RISCV_Impl_pipeline.pdf

Tiempo de ejecución y rendimiento

El pipelining mejora el rendimientro (numero de instrucciones por segundo) mas no el tiempo de ejecución de cada instrucción. Para entender esta afirmación consideremos un canal, o un tubo abierto en ambos extremos, digamos de unos 100 metros de largo. Si echamos un vaso de agua en el extremo de entrada, esa cantidad de agua llegará al otro extremo al cabo un cierto tiempo, (dependerá del largo e inclinación del canal), digamos que llega en 1 minuto. Sin embargo, si echamos vasos de agua, uno tras otro, en la entrada, después del primer minuto tendremos un chorro continuo en la salida. Cada vaso de agua sigue tomando un minuto para llegar, pero como aprovechamos continuamente la párte de canal que va quedando desocupada, el efecto es el notable incremento en la cantidad de agua recibida por unidad de tiempo. Eso es lo que pasa en la ejecución tubular de instrucciones. Apenas una unidad operativa queda desocupada la aprovechamos para la próxima instrucción (el próximo vaso de agua). Después del tienpo necesario para completar la primera instrucción logramos un chorro de instrucciones ejecutadas por unidad de tiempo, mayor que si tuviésemos que esperar que cada una completase su ciclo antes de iniciar la ejecución de la siguiente.

Conflictos en la tubería

Teóricamente, con un pipeline de «n» etapas, la mejora de rendimiento sería por un factor de «n», pero a diferencia del ejemplo del canal de agua, existen complicaciones que lo hacen menor que ese valor. Esas complicaciones son las siguientes:

  • Dependencia de datos: una instrucción puede necesitar un dato que debe producir la instrucción anterior. que aún no ha terminado de ejecutarse
  • Conflictos estructurales: una instrucción puede requerir el mismo hardware que está siendo utilizado por otra instrucción en la tubería
  • Conflictos de secuencia: los saltos condicionales, dependiendo de si son tomados o no, pueden invalidar el grupo de instrucciones en la tubería

La resolución de estos conflctos ha sido el objeto de mayor ateción en el diseño de las organizaciones tubulares. Para lograr una organizacioón tubular realmente útil se debe pensar en ello desde la escogencia del formato de instrucción, del repertorio de instrucciones y de los modos de direccionamiento, es decir toda la arquitectura debe ser pensada apuntando al máximo aprovechamiento de la tubería.

https://inst.eecs.berkeley.edu/~cs61c/sp20/pdfs/lectures/lec14.pdf

La gran ventaja de la forma de paralelismo introducida con pipelining es que es transparente al programador. En realidad, cierto ordenamiento de las instrucciones puede favorecer el rendimiento de la tubería, pero eso puede hacerlo el compilador. Para aprovechar en cambio el paralelismo ofrecido por multi-core se depende esencialmente de la disciplina del programador.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *