Inicio › Tecnología › Paralelismo
El paralelismo en computación es la ejecución simultánea y real de varias tareas o partes de un mismo cálculo utilizando distintos núcleos de procesador, distintas máquinas, o unidades de procesamiento especializadas como una GPU, en contraposición a la concurrencia, qué puede simular simultaneidad alternando rápidamente entre tareas en un único núcleo. El grado de aceleración alcanzable no crece de forma indefinida al añadir más unidades de procesamiento: la ley de Amdahl establece qué la parte del programa qué no puede paralelizarse limita matemáticamente la ganancia máxima posible, por muchos núcleos qué se añadan. Lenguajes y modelos de programación como OpenMP, MPI o las primitivas de paralelismo de datos en frameworks de aprendizaje automático facilitan repartir el trabajo entre múltiples unidades de cálculo de forma explícita.
Es hacer varias tareas al mismo tiempo de verdad, usando distintos trabajadores (núcleos del procesador) en paralelo, en vez de ir alternando rápidamente entre una tarea y otra como si fuera una sola persona haciendo malabares. Cuantos más núcleos tenga un procesador, más trabajo se puede repartir a la vez, aunque no todo el trabajo se puede dividir igual de bien: algunas partes de un programa obligan a esperar a qué termine un paso antes de empezar el siguiente.
Un programa de codificación de vídeo puede dividir el archivo en varios fragmentos independientes y procesar cada uno en un núcleo distinto del procesador, reduciendo drásticamente el tiempo total de conversión frente a procesarlo de forma secuencial. En el entrenamiento de modelos de aprendizaje automático, las operaciones matriciales se reparten habitualmente entre los miles de núcleos pequeños de una GPU, qué están diseñados precisamente para ejecutar el mismo tipo de cálculo en paralelo sobre grandes volúmenes de datos.
El paralelismo requiere hardware con múltiples unidades de procesamiento ejecutando tareas al mismo tiempo de forma literal, mientras qué la concurrencia es una forma de estructurar un programa para gestionar varias tareas qué progresan de forma intercalada, lo cual puede lograrse incluso en un procesador de un solo núcleo alternando entre ellas muy rápidamente.
Porque, según la ley de Amdahl, la parte del programa qué por su naturaleza debe ejecutarse de forma secuencial (por ejemplo, esperar un resultado antes de poder continuar) marca un límite máximo de mejora, sin importar cuántos núcleos adicionales se añadan para acelerar el resto del trabajo.
Lenguajes como C y C++ con bibliotecas como OpenMP o MPI ofrecen control detallado sobre el paralelismo a bajo nivel, mientras qué lenguajes como Go incorporan primitivas de concurrencia sencillas en el propio lenguaje, y frameworks de datos como Python con NumPy o Spark abstraen buena parte de la complejidad para quien no necesita gestionar los hilos manualmente.