En informática , un modelo de programación paralela es una abstracción de la arquitectura de computadoras paralelas , con la que es conveniente expresar algoritmos y su composición en programas . El valor de un modelo de programación se puede juzgar por su generalidad : qué tan bien se puede expresar una gama de diferentes problemas para una variedad de arquitecturas diferentes, y su rendimiento : qué tan eficientemente se pueden ejecutar los programas compilados. [1] La implementación de un modelo de programación paralela puede tomar la forma de una biblioteca invocada desde un lenguaje de programación , como una extensión de un lenguaje existente.
El consenso en torno a un modelo de programación particular es importante porque permite construir diferentes computadoras paralelas que admitan ese modelo, lo que facilita la portabilidad del software. En este sentido, los modelos de programación se consideran puentes entre el hardware y el software. [2]
Las clasificaciones de los modelos de programación paralela se pueden dividir en dos áreas generales: interacción de procesos y descomposición de problemas. [3] [4] [5]
La interacción entre procesos se relaciona con los mecanismos mediante los cuales los procesos paralelos pueden comunicarse entre sí. Las formas más comunes de interacción son la memoria compartida y el paso de mensajes, pero la interacción también puede ser implícita (invisible para el programador).
La memoria compartida es un medio eficiente para pasar datos entre procesos. En un modelo de memoria compartida, los procesos paralelos comparten un espacio de direcciones global en el que leen y escriben de forma asincrónica. El acceso concurrente asincrónico puede generar condiciones de carrera , y se pueden utilizar mecanismos como bloqueos , semáforos y monitores para evitarlas. Los procesadores multinúcleo convencionales admiten directamente la memoria compartida, que muchos lenguajes y bibliotecas de programación paralela, como Cilk , OpenMP y Threading Building Blocks , están diseñados para explotar.
En un modelo de paso de mensajes, los procesos paralelos intercambian datos pasándose mensajes entre sí. Estas comunicaciones pueden ser asincrónicas, donde se puede enviar un mensaje antes de que el receptor esté listo, o sincrónicas, donde el receptor debe estar listo. La formalización de paso de mensajes de los procesos secuenciales de comunicación (CSP) utiliza canales de comunicación sincrónica para conectar procesos y dio lugar a lenguajes importantes como Occam , Limbo y Go . Por el contrario, el modelo de actor utiliza el paso de mensajes asincrónico y se ha empleado en el diseño de lenguajes como D , Scala y SALSA.
Los modelos de espacio de direcciones global particionado (PGAS) proporcionan un punto intermedio entre la memoria compartida y el paso de mensajes. PGAS proporciona una abstracción del espacio de direcciones de memoria global que está particionada lógicamente, donde una porción es local para cada proceso. Los procesos paralelos se comunican realizando operaciones asincrónicas (por ejemplo, lecturas y escrituras) en el espacio de direcciones global, de una manera que recuerda a los modelos de memoria compartida. Sin embargo, al particionar semánticamente el espacio de direcciones global en porciones con afinidad con un proceso particular, permiten a los programadores explotar la localidad de referencia y habilitar una implementación eficiente en computadoras paralelas de memoria distribuida . PGAS es ofrecido por muchos lenguajes y bibliotecas de programación paralela, como Fortran 2008 , Chapel , UPC++ y SHMEM .
En un modelo implícito, el programador no ve ninguna interacción entre procesos y, en cambio, el compilador o el entorno de ejecución son los responsables de realizarla. Dos ejemplos de paralelismo implícito son los lenguajes específicos de dominio , en los que se prescribe la concurrencia dentro de las operaciones de alto nivel, y los lenguajes de programación funcional , en los que la ausencia de efectos secundarios permite que se ejecuten funciones no dependientes en paralelo. [6] Sin embargo, este tipo de paralelismo es difícil de gestionar [7] y los lenguajes funcionales como Concurrent Haskell y Concurrent ML proporcionan funciones para gestionar el paralelismo de forma explícita y correcta.
Un programa paralelo está compuesto por procesos que se ejecutan simultáneamente. La descomposición del problema se relaciona con la forma en que se formulan los procesos que lo componen. [8] [5]
Un modelo de paralelismo de tareas se centra en los procesos o hilos de ejecución. Estos procesos suelen ser distintos en cuanto a comportamiento, lo que pone de relieve la necesidad de comunicación. El paralelismo de tareas es una forma natural de expresar la comunicación mediante el paso de mensajes. En la taxonomía de Flynn , el paralelismo de tareas suele clasificarse como MIMD / MPMD o MISD .
Un modelo de paralelismo de datos se centra en la realización de operaciones sobre un conjunto de datos, normalmente una matriz estructurada de forma regular. Un conjunto de tareas operará sobre estos datos, pero de forma independiente en particiones disjuntas. En la taxonomía de Flynn , el paralelismo de datos suele clasificarse como MIMD / SPMD o SIMD .
El paralelismo de flujo, también conocido como paralelismo de canalización, se centra en dividir un cálculo en una secuencia de etapas, donde cada etapa procesa una parte de los datos de entrada. Cada etapa funciona de forma independiente y simultánea, y la salida de una etapa sirve como entrada para la siguiente etapa. El paralelismo de flujo es especialmente adecuado para aplicaciones con flujos de datos continuos o cálculos en canalización.
Al igual que con la interacción implícita de procesos, un modelo implícito de paralelismo no revela nada al programador, ya que el compilador, el entorno de ejecución o el hardware son los responsables. Por ejemplo, en los compiladores, la paralelización automática es el proceso de convertir código secuencial en código paralelo, y en la arquitectura informática, la ejecución superescalar es un mecanismo mediante el cual se aprovecha el paralelismo a nivel de instrucción para realizar operaciones en paralelo.
Los modelos de programación paralela están estrechamente relacionados con los modelos de computación . Un modelo de computación paralela es una abstracción utilizada para analizar el costo de los procesos computacionales, pero no necesariamente necesita ser práctico, en el sentido de que se puede implementar de manera eficiente en hardware y/o software. Un modelo de programación, en cambio, implica específicamente las consideraciones prácticas de implementación de hardware y software. [9]
Un lenguaje de programación paralela puede basarse en uno o en una combinación de modelos de programación. Por ejemplo, Fortran de alto rendimiento se basa en interacciones de memoria compartida y descomposición de problemas de datos en paralelo, y Go proporciona un mecanismo para la interacción de memoria compartida y paso de mensajes.
{{cite book}}
: |journal=
ignorado ( ayuda )