stringtranslate.com

Tubería (informática)

En informática , una tubería , también conocida como tubería de datos , [1] es un conjunto de elementos de procesamiento de datos conectados en serie, donde la salida de un elemento es la entrada del siguiente. Los elementos de una tubería a menudo se ejecutan en paralelo o en intervalos de tiempo. A menudo se inserta cierta cantidad de almacenamiento intermedio entre los elementos.

Los canales relacionados con la informática incluyen:

Algunos sistemas operativos [ se necesita ejemplo ] pueden proporcionar una sintaxis similar a UNIX para encadenar varias ejecuciones de programas en una canalización, pero implementan esta última como una simple ejecución en serie, en lugar de una verdadera canalización, es decir, esperando a que finalice cada programa antes de iniciar el siguiente. . [ cita necesaria ]

Concepto y motivación

Pipelining es un concepto comúnmente utilizado en la vida cotidiana. Por ejemplo, en la línea de montaje de una fábrica de automóviles, cada tarea específica (como instalar el motor, instalar el capó e instalar las ruedas) a menudo se realiza en una estación de trabajo separada. Las estaciones realizan sus tareas en paralelo, cada una en un vagón diferente. Una vez que un automóvil ha realizado una tarea, pasa a la siguiente estación. Las variaciones en el tiempo necesario para completar las tareas se pueden acomodar "almacenando" (manteniendo uno o más autos en un espacio entre las estaciones) y/o "deteniendo" (deteniendo temporalmente las estaciones aguas arriba), hasta que la siguiente estación esté disponible. .

Supongamos que ensamblar un automóvil requiere tres tareas que toman 20, 10 y 15 minutos, respectivamente. Entonces, si las tres tareas fueran realizadas por una sola estación, la fábrica produciría un automóvil cada 45 minutos. Utilizando una tubería de tres estaciones, la fábrica produciría el primer automóvil en 45 minutos y luego uno nuevo cada 20 minutos.

Como muestra este ejemplo, la canalización no disminuye la latencia , es decir, el tiempo total que tarda un elemento en pasar por todo el sistema. Sin embargo, aumenta el rendimiento del sistema , es decir, la velocidad a la que se procesan nuevos elementos después del primero.

Consideraciones de diseño

Equilibrando las etapas

Dado que el rendimiento de una tubería no puede ser mejor que el de su elemento más lento, el diseñador debe intentar dividir el trabajo y los recursos entre las etapas para que todas tomen el mismo tiempo en completar sus tareas. En el ejemplo de ensamblaje de automóviles anterior, si las tres tareas tomaran 15 minutos cada una, en lugar de 20, 10 y 15 minutos, la latencia seguiría siendo de 45 minutos, pero entonces se terminaría un automóvil nuevo cada 15 minutos, en lugar de 20.

Almacenamiento en búfer

En circunstancias ideales, si todos los elementos de procesamiento están sincronizados y tardan la misma cantidad de tiempo en procesarse, entonces cada elemento puede recibir cada elemento tal como lo libera el anterior, en un solo ciclo de reloj . De esta manera, los elementos fluirán a través de la tubería a una velocidad constante, como olas en un canal de agua. En tales "canalizaciones de ondas", [2] no se necesita sincronización ni almacenamiento en búfer entre las etapas, además del almacenamiento necesario para los elementos de datos.

En términos más generales, la amortiguación entre las etapas del ducto es necesaria cuando los tiempos de procesamiento son irregulares o cuando se pueden crear o destruir elementos a lo largo del ducto. Por ejemplo, en una canalización de gráficos que procesa triángulos para representar en la pantalla, un elemento que verifica la visibilidad de cada triángulo puede descartar el triángulo si es invisible, o puede generar dos o más piezas triangulares del elemento si están parcialmente oculto. El almacenamiento en búfer también es necesario para dar cabida a las irregularidades en las velocidades a las que la aplicación alimenta elementos a la primera etapa y consume la salida de la última.

El buffer entre dos etapas puede ser simplemente un registro de hardware con sincronización adecuada y lógica de señalización entre las dos etapas. Cuando una etapa A almacena un elemento de datos en el registro, envía una señal de "datos disponibles" a la siguiente etapa B. Una vez que B ha usado esos datos, responde con una señal de "datos recibidos" a A. La etapa A se detiene, esperando para esta señal, antes de almacenar el siguiente elemento de datos en el registro. La etapa B se detiene, esperando la señal de "datos disponibles", si está lista para procesar el siguiente elemento pero la etapa A aún no lo ha proporcionado.

Si los tiempos de procesamiento de un elemento son variables, es posible que todo el proceso tenga que detenerse, esperando a que ese elemento y todos los anteriores consuman los elementos en sus búferes de entrada. La frecuencia de tales paradas en la tubería se puede reducir proporcionando espacio para más de un elemento en el buffer de entrada de esa etapa. Un búfer de varios elementos de este tipo generalmente se implementa como una cola de primero en entrar, primero en salir . Es posible que aún sea necesario detener la etapa ascendente cuando la cola se llena, pero la frecuencia de esos eventos disminuirá a medida que se proporcionen más espacios de búfer. La teoría de colas puede indicar el número de espacios de búfer necesarios, dependiendo de la variabilidad de los tiempos de procesamiento y del rendimiento deseado.

Tuberías no lineales

Si alguna etapa tarda (o puede tardar) mucho más que las demás y no se puede acelerar, el diseñador puede proporcionar dos o más elementos de procesamiento para llevar a cabo esa tarea en paralelo, con un único búfer de entrada y un único búfer de salida. Cuando cada elemento termina de procesar su elemento de datos actual, lo entrega al búfer de salida común y toma el siguiente elemento de datos del búfer de entrada común. Este concepto de canalización "no lineal" o "dinámica" se ejemplifica en tiendas o bancos que tienen dos o más cajeros que atienden a los clientes desde una única cola de espera.

Dependencias entre elementos

En algunas aplicaciones, el procesamiento de un elemento Y mediante una etapa A puede depender de los resultados o efectos del procesamiento de un elemento X anterior mediante alguna etapa B posterior del proceso. En ese caso, la etapa A no puede procesar correctamente el artículo Y hasta que el artículo X haya superado la etapa B.

Esta situación ocurre muy a menudo en los canales de instrucción. Por ejemplo, supongamos que Y es una instrucción aritmética que lee el contenido de un registro que se suponía había sido modificado por una instrucción anterior X. Sea A la etapa que recupera los operandos de la instrucción y B la etapa que escribe el resultado. al registro especificado. Si la etapa A intenta procesar la instrucción Y antes de que la instrucción X llegue a la etapa B, es posible que el registro aún contenga el valor anterior y el efecto de Y sería incorrecto.

Para manejar dichos conflictos correctamente, la tubería debe contar con circuitos o lógica adicionales que los detecten y tomen las medidas adecuadas. Las estrategias para hacerlo incluyen:

En lugar de detenerse mientras se espera que finalice X, la etapa A puede adivinar si se tomará la rama o no, y buscar la siguiente instrucción Y basándose en esa suposición. Si más tarde la suposición resulta ser incorrecta (con suerte, rara vez), el sistema tendría que retroceder y continuar con la elección correcta. Es decir, todos los cambios que se realizaron en el estado de la máquina mediante la etapa A y las etapas posteriores basadas en esa suposición tendrían que deshacerse, las instrucciones que siguen a X que ya están en proceso tendrían que eliminarse y la etapa A tendría que reiniciarse con el puntero de instrucción correcto . Esta estrategia de predicción de ramas es un caso especial de ejecución especulativa .

Implementaciones de software típicas

Para implementarse de manera efectiva, las canalizaciones de datos necesitan una estrategia de programación de CPU para enviar el trabajo a los núcleos de CPU disponibles y el uso de estructuras de datos en las que operarán las etapas de la canalización. Por ejemplo, los derivados de UNIX pueden canalizar comandos que conectan E/S estándar de varios procesos, utilizando las canalizaciones implementadas por el sistema operativo.

Los enfoques de nivel inferior pueden depender de los subprocesos proporcionados por el sistema operativo para programar el trabajo en las etapas: tanto las implementaciones basadas en grupos de subprocesos como las de un subproceso por etapa son viables y existen. [3]

Existen otras estrategias que se basan en la multitarea cooperativa , que no necesitan múltiples subprocesos de ejecución y, por lo tanto, núcleos de CPU adicionales, como el uso de un programador por turnos con un marco basado en corrutinas. En este contexto, se puede crear una instancia de cada etapa con su propia rutina, devolviendo el control al programador después de finalizar su tarea redonda. Este enfoque puede requerir un control cuidadoso de las etapas del proceso para evitar que abusen de su tiempo.

Costos e inconvenientes

Un sistema canalizado normalmente requiere más recursos (elementos de circuito, unidades de procesamiento, memoria de computadora, etc.) que uno que ejecuta un lote a la vez, porque sus etapas no pueden compartir esos recursos y porque es posible que se necesite almacenamiento en búfer y lógica de sincronización adicional entre los elementos.

Además, la transferencia de elementos entre elementos de procesamiento separados puede aumentar la latencia, especialmente en el caso de canalizaciones largas.

El costo de complejidad adicional de la canalización puede ser considerable si existen dependencias entre el procesamiento de diferentes elementos, especialmente si se utiliza una estrategia de adivinar y retroceder para manejarlos. De hecho, el costo de implementar esa estrategia para conjuntos de instrucciones complejos ha motivado algunas propuestas radicales para simplificar la arquitectura informática , como RISC y VLIW . A los compiladores también se les ha encomendado la tarea de reorganizar las instrucciones de la máquina para mejorar el rendimiento de los canales de instrucciones.

Nuevas tecnologías

Es cierto que en los últimos años las demandas sobre las aplicaciones y su hardware subyacente han sido significativas. Por ejemplo, crear canalizaciones con aplicaciones de un solo nodo que rastrean los datos fila por fila ya no es factible con el volumen y la variedad de big data . Sin embargo, con la llegada de motores de análisis de datos como Hadoop o, más recientemente, Apache Spark , ha sido posible distribuir grandes conjuntos de datos en múltiples nodos de procesamiento, lo que permite que las aplicaciones alcancen niveles de eficiencia varios cientos de veces mayores de lo que se creía posible antes. El efecto de esto hoy es que incluso una PC de nivel medio que utilice procesamiento distribuido de esta manera puede manejar la construcción y ejecución de grandes canales de datos. [4]

Ver también

Referencias

  1. ^ Desarrollo de canalización de datos Archivado el 24 de mayo de 2018 en Wayback Machine Publicado por Dativa, consultado el 24 de mayo de 2018
  2. ^ O. Hauck; Sorin A. Huss; M. Garg (1999). "Tuberías de ondas asíncronas bifásicas y su aplicación a un 2D-DCT". Actas. Quinto Simposio Internacional de Investigación Avanzada en Circuitos y Sistemas Asíncronos . págs. 219-228. doi :10.1109/ASYNC.1999.761536. ISBN 0-7695-0031-5. S2CID  206515615.
  3. ^ "MTDP". GitHub . Septiembre de 2022.
  4. ^ ¿ Qué es una canalización de datos? Publicado por Data Pipelines, consultado el 11 de marzo de 2021

Bibliografía