El paralelismo de tareas (también conocido como paralelismo de funciones y paralelismo de control ) es una forma de paralelización del código informático entre varios procesadores en entornos de computación paralela . El paralelismo de tareas se centra en la distribución de tareas (realizadas simultáneamente por procesos o subprocesos) entre diferentes procesadores. A diferencia del paralelismo de datos , que implica ejecutar la misma tarea en diferentes componentes de datos, el paralelismo de tareas se distingue por ejecutar muchas tareas diferentes al mismo tiempo en los mismos datos. [1] Un tipo común de paralelismo de tareas es la canalización , que consiste en mover un único conjunto de datos a través de una serie de tareas separadas donde cada tarea puede ejecutarse independientemente de las demás.
En un sistema multiprocesador, el paralelismo de tareas se logra cuando cada procesador ejecuta un hilo (o proceso) diferente sobre los mismos datos o sobre datos diferentes. Los hilos pueden ejecutar el mismo código o un código diferente. En el caso general, los diferentes hilos de ejecución se comunican entre sí mientras trabajan, pero esto no es un requisito. La comunicación suele tener lugar al pasar datos de un hilo al siguiente como parte de un flujo de trabajo . [2]
Como ejemplo simple, si un sistema está ejecutando código en un sistema de 2 procesadores ( CPU "a" y "b") en un entorno paralelo y deseamos realizar las tareas "A" y "B", es posible indicarle a la CPU "a" que realice la tarea "A" y a la CPU "b" que realice la tarea "B" simultáneamente, reduciendo así el tiempo de ejecución. Las tareas se pueden asignar utilizando instrucciones condicionales como se describe a continuación.
El paralelismo de tareas enfatiza la naturaleza distribuida (paralelizada) del procesamiento (es decir, los subprocesos), en oposición a los datos ( paralelismo de datos ). La mayoría de los programas reales se encuentran en algún punto intermedio entre el paralelismo de tareas y el paralelismo de datos. [3]
El paralelismo a nivel de subprocesos ( TLP ) es el paralelismo inherente a una aplicación que ejecuta varios subprocesos a la vez. Este tipo de paralelismo se encuentra principalmente en aplicaciones escritas para servidores comerciales , como bases de datos. Al ejecutar muchos subprocesos a la vez, estas aplicaciones pueden tolerar las altas cantidades de E/S y latencia del sistema de memoria que pueden generar sus cargas de trabajo: mientras un subproceso se retrasa esperando un acceso a la memoria o al disco, otros subprocesos pueden realizar un trabajo útil.
La explotación del paralelismo a nivel de subprocesos también ha comenzado a abrirse paso en el mercado de los ordenadores de sobremesa con la llegada de los microprocesadores multinúcleo . Esto se ha producido porque, por diversas razones, cada vez resulta más impráctico aumentar la velocidad de reloj o las instrucciones por reloj de un único núcleo. Si esta tendencia continúa, será necesario diseñar nuevas aplicaciones que utilicen múltiples subprocesos para aprovechar el aumento de la potencia de cálculo potencial. Esto contrasta con las innovaciones anteriores en materia de microprocesadores, en las que el código existente se aceleraba automáticamente al ejecutarlo en un ordenador más nuevo y más rápido.
El pseudocódigo siguiente ilustra el paralelismo de tareas:
programa:...Si CPU = "a" entonces hacer la tarea "A"De lo contrario, si CPU="b" entonces hacer la tarea "B"terminar si...Fin del programa
El objetivo del programa es realizar una tarea total neta ("A+B"). Si escribimos el código como se indica arriba y lo ejecutamos en un sistema de 2 procesadores, el entorno de ejecución lo ejecutará de la siguiente manera.
Código ejecutado por la CPU "a":
programa:...hacer la tarea "A"...Fin del programa
Código ejecutado por la CPU "b":
programa:...hacer la tarea "B"...Fin del programa
Este concepto ahora se puede generalizar a cualquier número de procesadores.
El paralelismo de tareas se puede soportar en lenguajes de uso general mediante bibliotecas o funciones integradas. Algunos ejemplos notables incluyen:
Se pueden encontrar ejemplos de lenguajes de tareas paralelas de grano fino en el ámbito de los lenguajes de descripción de hardware como Verilog y VHDL .