La computación paralela es un tipo de computación en la que se realizan muchos cálculos o procesos simultáneamente. [1] Los problemas grandes a menudo se pueden dividir en otros más pequeños, que luego se pueden resolver al mismo tiempo. Hay varias formas diferentes de computación en paralelo: a nivel de bit , a nivel de instrucción , los datos , y el paralelismo de tareas . El paralelismo se ha empleado durante mucho tiempo en la informática de alto rendimiento , pero ha ganado un interés más amplio debido a las limitaciones físicas que impiden el escalado de frecuencias . [2]Dado que el consumo de energía (y, en consecuencia, la generación de calor) de las computadoras se ha convertido en una preocupación en los últimos años, [3] la computación paralela se ha convertido en el paradigma dominante en la arquitectura de las computadoras , principalmente en forma de procesadores de múltiples núcleos . [4]
La computación paralela está estrechamente relacionada con la computación concurrente; se usan con frecuencia juntas y, a menudo, se combinan, aunque las dos son distintas: es posible tener paralelismo sin concurrencia (como el paralelismo a nivel de bits ) y concurrencia sin paralelismo (como multitarea por tiempo compartido en una CPU de un solo núcleo). [5] [6] En la computación paralela, una tarea computacional se divide típicamente en varias, a menudo muchas, subtareas muy similares que se pueden procesar de forma independiente y cuyos resultados se combinan posteriormente, una vez completadas. Por el contrario, en la computación concurrente, los diversos procesos a menudo no abordan tareas relacionadas; cuando lo hacen, como es típico en la informática distribuida, las tareas separadas pueden tener una naturaleza variada y, a menudo, requieren alguna comunicación entre procesos durante la ejecución.
Las computadoras paralelas se pueden clasificar aproximadamente según el nivel en el que el hardware admite el paralelismo, con computadoras de múltiples núcleos y multiprocesadores que tienen múltiples elementos de procesamiento dentro de una sola máquina, mientras que los clústeres , MPP y cuadrículas usan múltiples computadoras para trabajar en la misma tarea. Las arquitecturas de computadora paralelas especializadas a veces se utilizan junto con los procesadores tradicionales, para acelerar tareas específicas.
En algunos casos, el paralelismo es transparente para el programador, como en el paralelismo a nivel de bits o de instrucción, pero los algoritmos explícitamente paralelos , particularmente aquellos que usan concurrencia, son más difíciles de escribir que los secuenciales , [7] porque la concurrencia introduce varios nuevos clases de posibles errores de software , de las cuales las condiciones de carrera son las más comunes. La comunicación y la sincronización entre las diferentes subtareas suelen ser algunos de los mayores obstáculos para obtener un rendimiento óptimo del programa paralelo.
Un límite superior teórico sobre la aceleración de un solo programa como resultado de la paralelización viene dado por la ley de Amdahl .
Tradicionalmente, el software de computadora se ha escrito para computación en serie . Para resolver un problema, se construye e implementa un algoritmo como un flujo de instrucciones en serie. Estas instrucciones se ejecutan en una unidad central de procesamiento en una computadora. Solo se puede ejecutar una instrucción a la vez; una vez finalizada esa instrucción, se ejecuta la siguiente. [8]