Friday, October 15, 2010

Pipeline




  1. Pipelining es una técnica para hacer más veloces los microprocesadores. Ya se mencionó en otras clases los inconvenientes que presenta el tener que traer instrucciones y datos de la memoria pero ahora analizamos el hecho de que sólo podemos ejecutar una instrucción a la vez con la arquitectura actual de nuestro ARC. El pipeline se asemeja a una linea de ensamblaje en cada etapa del proceso (en este caso las etapas que intervienen en la ejecución de una instrucción : traer la instrucción de la memoria, decodificarla, traer los operandos, ejecutar la operación y hacer el writeback respectivo) se tiene una "entidad independiente" con capacidades de almacenamiento (en este caso un registro) cada una de las cuales recibe el producto de la etapa anterior y le aplica el proceso que le corresponda. Como consecuencia lógica entre más larga es la "línea de montaje" hay un retraso inicial pero una vez que está llena comenzamos a tener una instrucción completa en cada ciclo. Es importante subrayar que para que el pipeline sea eficiente todas las fases deben tener la misma duración aproximadamente o de lo contrario existirá un overhead causado por aquella fase que tenga la duración más larga. Obviamente en esta implementación todavía no involucramos la existencia de saltos dentro de las instrucciones del programa. Si analizamos las fases características en el ciclo de una instrucción, observamos que la ejecución de la operación suele ser la más tardada de todas por lo que existen implementaciones que permiten ejecutar varias operaciones a la vez y recibe esta técnica el nombre de arquitecturas escalables.

  2. Dentro del punto anterior también es digno de mención el señalar que las arquitecturas actuales reducen considerablemente la latencia de la memoria mediante la implementación de caches dentro del micro.

  3. Discutimos el benchmarking y diversas alternativas libres y comerciales para tener un estimado del desempeño de un equipo. Lo más importante en mi opinión es utilizar estas herramientas para hacer troubleshooting; si el benchmark arroja un resultado no esperado de hipo-desempeño (existirá ese término?) bueno , desempeño por debajo del normal, nos puede dar un hint para diagnosticar desviaciones.

  4. La herramienta make es sumamente útil. La estructura es: objetivo: dependencias y abajo ponemos la "receta" para generar dichas dependencias. Es útil también generar una regla "clean" para deshacernos de los archivos intermedios. Lo que falta es encontrar una manera eficiente para que la herramienta detecte los cambios en mi código fuente ya que aparentemente sólo me está monitoreando los archivos intermedios.

  5. Mysql++ es un api para interfaces de bases de datos muy fácil, claro y versatil, sobre todo para los que manejamos c++ como lenguaje favorito.

  6. fork() es una llamada al sistema muy útil para programar servidores concurrentes, por supuesto la técnica preferida es utilizar threads pero aún no me familiarizo del todo con la implementación en unix y stevens le dedica como 100 hojas al asunto por lo que me tendré que tomar un tiempo para utilizarlos en mi aplicación distribuida. Hay una particularidad muy especial dentro del manejo de fork para el tipo de aplicaciones que estamos desarrollando en sd, y esta es que los procesos hijo una vez que terminan no mueren por completo, quedan en modo zombie por si el padre hace un query sobre el estado de los mismos ocasionado un clogging en la tabla de procesos del kernel, por lo que estoy utilizando signal(SIGCHILD, SIG_IGN).





No comments:

Post a Comment