Modelo de programación paralela
# Modelo de programación paralela

En los programas informáticos, un modelo de programación paralela es un modelo para escribir programas paralelos los cuales pueden ser compilados y ejecutados. El valor de un modelo de programación puede ser juzgado por su generalidad (Si las soluciones ofrecidas son óptimas a comparación de diferentes arquitecturas o soluciones existentes), y su rendimiento (Eficiencia, precisión o velocidad de la ejecución). La implementación de un modelo de programación puede tomar varias formas, tales como bibliotecas invocadas desde lenguajes secuenciales tradicionales, extensiones del lenguaje, o nuevos modelos completos de ejecución.

Es importante que haya un consenso entre cada uno de los modelos de programación, ya que permite que el software desarrollado pueda ejecutarse en diferentes arquitecturas. Para arquitecturas de programación secuencial se puede utilizar el modelo de von Neumann, ya que proporciona un puente eficaz entre hardware y software, lo que significa que lenguajes de alto nivel pueden compilarse eficientemente y se pueden implementar de manera eficiente en el hardware.

## Características principales

Las características de los modelos de programación paralela se pueden sub-dividir ampliamente, pero se puede generalizar en 2 rasgos fundamentales: la interacción de procesos y los problemas de descomposición.

### Interacción de proceso

La interacción de proceso se refiere a los mecanismos por los cuales procesos paralelos son capaces de comunicarse entre sí. Las formas más comunes de interacción son la memoria y el paso de mensajes compartidos, pero también puede ser implícita.

**Memoria compartida**

La memoria compartida es un medio eficaz de pasar datos entre programas. Dependiendo del contexto, los programas pueden ejecutarse en un procesador único o en varios procesadores separados. En este modelo, las tareas paralelas comparten un espacio de direcciones global donde ellas leen y escriben de forma asíncrona. Esto requiere mecanismos de protección, tales como cerraduras, semáforos y monitores para controlar el acceso concurrente. La memoria compartida puede ser emulada en sistemas de memoria distribuida pero los tiempos de NUMA (acceso a memoria no uniforme, Non-Uniform Memory Access) pueden entrar en juego. A veces la memoria también es compartida entre diferentes secciones del código del mismo programa. Por ejemplo, un bucle for puede crear hilos para cada iteración que actualiza una variable en paralelo.

**Paso de mensaje**

El paso de mensajes es un concepto de la informática que se utiliza ampliamente en el diseño e implementación de modernas aplicaciones de software; es clave para algunos modelos de concurrencia y la programación orientada a objetos. En un modelo de paso de mensajes, las tareas paralelas intercambian datos a través del paso de mensajes entre sí. Estas comunicaciones pueden ser asíncronas o síncronas. La formalización de la Comunicación de procesos secuenciales (CSP) del paso de mensaje emplea canales de comunicación para conectar procesos, y dio lugar a una serie de lenguajes importantes, como Joyce, Occam y Erlang.

**Implícito**

En un modelo implícito, ninguna interacción del proceso es visible al programador, en cambio el compilador y/o tiempo de ejecución es responsable de realizar la misma. Esto es más común con los lenguajes con especificidad de dominio en el que la concurrencia de un problema puede ser más prescrita.

### Descomposición de problema

Un programa paralelo está compuesto de procesos que están ejecutándose simultáneamente. La descomposición del problema se refiere a la forma en que se formula estos procesos. Esta clasificación también puede ser referida como esqueletos algorítmicos o paradigmas de programación paralela.

**Paralelismo de tarea**

Un modelo de tarea paralela se centra en los procesos o hilos de ejecución. Estos procesos suelen tener conductas distintas, que hace hincapié en la necesidad de comunicación. El paralelismo de tareas es una forma natural de expresar la comunicación de paso de mensajes. Por lo general se clasifica como MIMD/MPMD o MISD.

**Paralelismo de dato**

Un modelo de datos en paralelo se centra en realizar operaciones en un conjunto de datos que por lo general está estructurado en una matriz. Un conjunto de tareas realizará operaciones en estos datos, pero de forma independiente en particiones separadas. En un sistema de memoria compartida, los datos serán accesibles para todos, pero en un sistema de memoria distribuida estos serán divididos entre las memorias y trabajados de forma local. El paralelismo de datos por lo general se clasifica como MIMD/SPMD o SIMD.

**Sistemas Paralelos idealizados**

Los sistemas idealizados son divididos en dos categorías. Los sistemas analizados en la primera categoría, se caracterizan por el aislamiento del espacio de diseño abstracto visto por el programador. En esta, todos los procesos son presentados con el mismo acceso a algún tipo de espacio de memoria compartida. En su forma más fácil, cualquier proceso puede intentar acceder a cualquier tema en cualquier momento. La segunda categoría considera máquinas en las que los dos niveles están más cerca entre sí y, en particular, aquellos en los que el mundo del programador incluye paralelismo explícito. Esta categoría descarta la memoria compartida y trabaja con base en cooperación con alguna forma de paso de mensaje explícito.

## Ejemplo modelos de programación paralela

* Esqueletos algorítmicos
* Componentes
* Objetos distribuidos
* Invocación de Método de manera remota
* Workflows
* Máquina de Acceso paralelo Aleatorio
* Procesamiento de flujo
* Bulk synchronous parallelism
