IT & Engineering

¿Qué es la programación paralela y cómo puedo utilizarla?

La programación paralela consiste en dividir las tareas en otras más pequeñas y ejecutarlas de forma simultánea. Es una excelente herramienta para ejecutar proyectos a gran escala de forma rápida y precisa, pero ¿es la herramienta adecuada para ti?
Imagen para ¿Qué es la programación paralela y cómo puedo utilizarla?

Estamos aquí para hablar de programación paralela, pero queremos ambientar la situación con burritos para que el tema sea más fácil de digerir. Si tuvieras que preparar 100 burritos para una fiesta, tardarías muchísimo tiempo. Pero ¿y si reunieras a un grupo de nueve amistades y les dieras instrucciones precisas para preparar burritos? La misma tarea que te habría llevado decenas de horas ahora puede estar lista en unos 30 min, dependiendo de lo rápido que los enrolles.

Montar la producción de burritos requiere preparar los ingredientes, reunir a las amistades, dar instrucciones y comprobar la calidad, pero distribuir la tarea entre diez personas y ejecutarla en paralelo sin duda te ahorra mucho tiempo. Podemos hacer lo mismo en programación con la programación paralela.

¿No tienes claro qué significa esto? No te preocupes. Este artículo cubre los conceptos básicos de la programación paralela, sus usos comunes y sus ventajas e inconvenientes.

¿Qué es la programación paralela y cómo funciona?

La programación paralela suele utilizarse indistintamente con los términos procesamiento en paralelo, computación en paralelo y soluciones de computación en paralelo. La programación paralela es como tener diez estaciones de preparación de burritos en paralelo en lugar de preparar 100 burritos poco a poco por tu cuenta. En términos de informática, la programación paralela es el proceso de dividir un problema en tareas más pequeñas que pueden ejecutarse al mismo tiempo (en paralelo) utilizando múltiples recursos informáticos. En otras palabras, la programación paralela permite a los equipos de programación ejecutar proyectos a gran escala que requieren velocidad y precisión.

Puedes utilizar técnicas de procesamiento en paralelo en varios dispositivos, desde un dispositivo móvil hasta portátiles o superordenadores. Los distintos lenguajes de programación se basan en diferentes tecnologías para permitir el paralelismo. Open Multi-Processing (OpenMP) proporciona una API multiplataforma para desarrollar aplicaciones paralelas con C, C++ y Fortran en los núcleos de una única CPU.

Por otro lado, tecnologías como la interfaz de paso de mensajes (MPI, por sus siglas en inglés) permiten procesos paralelos entre diferentes ordenadores o nodos.

¿Cuáles son los diferentes modelos de programación paralela?

La programación paralela es un concepto general que puede englobar muchos tipos de procesos que se ejecutan simultáneamente en la misma máquina o en máquinas diferentes. Antes de entrar en materia, diferenciemos algunos modelos populares de programación paralela:

  • El modelo de memoria compartida
  • El modelo de paso de mensajes
  • El modelo de espacio de direcciones globales particionado

Estos modelos describen cómo interactúan los procesos entre sí en la programación paralela. A continuación, analizaremos cada uno de ellos, así como algunos de los principios de la programación paralela, con más detalle.

¿Qué es el paralelismo de datos?

El paralelismo de datos consiste en tomar una tarea determinada y dividir su ejecución en función del trabajo que hay que realizar. Continuemos con el ejemplo de los burritos. Imagina que dos de tus amistades y tú tenéis que preparar 100 burritos. Una forma de dividir este trabajo sería que cada persona preparara 33 burritos de forma simultánea.

¿Qué es el paralelismo de tareas?

El paralelismo de tareas consiste en dividir la ejecución de una tarea en tareas individuales. Esta vez, en lugar de dividir el trabajo por el número de burritos, una persona prepararía la tortilla, otra el chorizo y la tercera los montaría.

¿Qué es la programación multihilo?

La programación multihilo es un subconjunto de la programación paralela en el que más de un conjunto de instrucciones secuenciales (“hilos”) se ejecuta de forma simultánea. El multihilo es un concepto que puede darse en un único núcleo o en múltiples procesos. Si los hilos se ejecutan en un único procesador, este cambia rápidamente entre un hilo y otro. Es importante destacar que, en un solo núcleo, cambiar rápidamente de proceso no es una representación real de la programación multihilo, sino más bien un ejemplo de la CPU priorizando la ejecución de estos procesos. Cuando los hilos se ejecutan en múltiples procesadores, lo hacen de forma simultánea.

La programación multihilo implica la ejecución de múltiples hilos desde múltiples procesadores y permite ejecutar tareas simultáneas desde una reserva o un grupo de memoria compartida.

¿Qué es el modelo de memoria compartida?

Con el modelo de memoria compartida, el programa es un conjunto de procesos que utilizan variables comunes o compartidas. Este programa es común, con los datos asociados almacenados en la memoria principal. Todos los procesos acceden a este programa y a estos datos comunes. A cada proceso se le asigna una parte diferente del programa y de los datos, y el programa principal crea procesos separados para cada procesador. Una vez ejecutados los procesos, todos se reincorporan al programa principal.

Los procesos comparten un espacio de direcciones globales donde realizan funciones de lectura y escritura de forma asíncrona.

¿Qué es el modelo de paso de mensajes?

En el modelo de paso de mensajes, los procesos paralelos intercambian datos enviándose mensajes entre sí. Estos mensajes pueden ser asíncronos o síncronos.

¿Qué es el modelo de espacio de direcciones globales particionado?

Los modelos de espacio de direcciones globales particionado (PGAS, por sus siglas en inglés) se sitúan en un punto intermedio entre los modelos de memoria compartida y los de paso de mensajes. El PGAS proporciona un espacio de direcciones de memoria global particionado lógicamente para cada proceso. Los procesos paralelos “hablan” realizando operaciones asíncronas, como funciones de lectura y escritura, en el espacio de direcciones globales.

¿Para qué se utiliza habitualmente la programación paralela?

Dado que la programación paralela es excelente para descomponer tareas complejas, suele dar los mejores resultados al realizar cálculos complejos, grandes conjuntos de datos o simulaciones a gran escala.

Estos son algunos casos de uso de la programación paralela:

  • Gráficos avanzados en la industria del entretenimiento
  • Física aplicada
  • Investigación climática
  • Ingeniería eléctrica
  • Modelado financiero y económico
  • Modelado molecular
  • Defensa nacional y armamento nuclear
  • Exploración de petróleo y gas
  • Mecánica cuántica

¿Por qué debería utilizar la programación paralela?

Puedes utilizar la programación paralela cuando quieras procesar rápidamente grandes cantidades de datos. Es fácil y puede ayudarte a terminar los proyectos de forma rápida y eficiente. Aunque la programación paralela puede crear deuda técnica y requiera mucho tiempo de configuración (al fin y al cabo, el equipo de programación necesita desarrollar algoritmos y código paralelos eficientes), el proceso ahorra tiempo en general. Aprovechando la potencia del procesamiento en paralelo, la programación paralela ejecuta un programa específico en múltiples nodos de cálculo y núcleos de CPU al mismo tiempo.

El procesamiento de datos no tiene por qué ser difícil y, con la ayuda de la programación paralela, puedes llevar tu lista de tareas al siguiente nivel.

El beneficio más importante de la programación paralela es una ejecución más rápida del código, lo que te ahorra tiempo de ejecución y esfuerzo. En lugar de ejecutar código secuencial, ejecutarías código paralelo. Estas ventajas son especialmente evidentes en el paralelismo de datos a gran escala, como se muestra en el ejemplo anterior. El paralelismo de datos se da cuando hacemos que cada hilo trabaje en el mismo conjunto de tareas sobre un subconjunto de valores. Esto significa que cada hilo realiza la misma tarea en diferentes conjuntos de datos (se paralelizan los propios datos, no las tareas). Menos tareas significan menos tiempo y esfuerzo, lo que equivale a más tiempo para dedicar a otros detalles y proyectos.

Sin embargo, la programación paralela no se limita al paralelismo de datos. Podemos  repartir la ejecución del código en varias tareas para una ejecución más rápida, distribuyendo las tareas en diferentes hilos y en diferentes procesadores. Al hacerlo, también estamos aumentando los recursos naturales de trabajo de un programa y, por tanto, incrementando su capacidad. En resumen, hacemos las cosas más rápido.

¿Siempre es buena idea utilizar la programación paralela?

A pesar de todas sus virtudes, la velocidad tiene sus inconvenientes. En la programación paralela, el código se ejecuta de forma no secuencial. Si una operación requiere un orden específico de código para procesar la siguiente instrucción, esa operación fallará si aplicas la programación paralela.

Dado que el código avanza rápidamente durante la programación paralela, también puede generar algunos errores nuevos. Los dos grandes errores a los que hay que prestar atención son las condiciones de carrera, donde dos procesos toman involuntariamente los mismos datos y crean mutaciones inesperadas, y los puntos muertos, en los que los hilos no pueden liberar la memoria adecuadamente, lo que provoca que se esperen mutuamente de forma interminable para finalizar un proceso.

¿Cuál es un ejemplo de procesamiento en paralelo?

Pasemos de la teoría a algo más práctico. En esta sección, presentaremos una introducción a la computación en paralelo.

Para este ejemplo, utilizaremos C# y Data Processing con el fin de crear un bucle secuencial general que se ejecutará a lo largo de varios hilos.

Para entender la programación paralela en un contexto empresarial, imagina que estás intentando procesar un gran grupo de datos de nóminas.

                                

                                    //model
public class Employees
{
public string name {get; set; }
public double salary {get; set; }
}

//Instantiate Class
List employeeList = new List();
employeeList.add("Sam", 1000.0);
employeeList.add("Dean", 1000.0);
employeeList.add("Bob", 2500.0);
                                
                            

Para procesar estos datos, puedes dividirlos en partes más pequeñas y ejecutarlas en paralelo. Al ejecutarlas en paralelo, tomas elementos de datos como person.name y su salario, y los procesas en diferentes hilos.

                                

                                    //Parallel Simple Example
public void CalculateSalary(List employeeList){
    Parallel.ForEach(employeeList, person =>
    {
        Debug.WriteLine("Name :" + person.name + ", Salary: $" +      person.salary);
    });
}
                                
                            

Procesar simultáneamente estos distintos hilos más pequeños es más rápido que procesar un único hilo largo. Y, como todo el mundo sabe, todo lo relacionado con hacer las nóminas más rápido es una ventaja para cualquiera.

En resumen

Fácil y eficiente, ¿verdad? En este artículo, hemos presentado brevemente la programación paralela y cómo puedes utilizarla en tus prácticas de desarrollo de email. En Mailgun, nuestros equipos de TI e Ingeniería siempre están explorando y compartiendo herramientas y formas de optimizar.

¿Quieres acceder a lo que piensan nuestros equipos de ingeniería? Echa un vistazo a nuestra sección de ingeniería de software: tutoriales y materiales educativos. O bien, suscríbete a nuestra newsletter para no perderte nunca nuestros trucos y consejos.

¡Mantenme informado/a! Recibe excelentes recursos en tu bandeja de entrada cada semana.
Envíame la newsletter de Mailjet. Acepto expresamente recibir la newsletter y sé que puedo darme de baja fácilmente en cualquier momento.

¡Consulta mensualmente tu bandeja de entrada para recibir la newsletter de Mailjet!