Modelo de programación paralela
En informática, un modelo de programación paralela es una abstracción de la arquitectura informática paralela, con la que conviene 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 variedad de problemas diferentes para una variedad de arquitecturas diferentes, y su rendimiento: qué tan eficientemente se puede expresar. los programas compilados pueden ejecutarse. La implementación de un modelo de programación paralela puede tomar la forma de una biblioteca invocada desde un lenguaje secuencial, como una extensión de un lenguaje existente o como un lenguaje completamente nuevo.
El consenso en torno a un modelo de programación particular es importante porque lleva a que se construyan diferentes computadoras paralelas con soporte para el modelo, facilitando así la portabilidad del software. En este sentido, los modelos de programación se denominan puente entre hardware y software.
Clasificación de modelos de programación paralela
Las clasificaciones de los modelos de programación paralela se pueden dividir en términos generales en dos áreas: interacción de procesos y descomposición de problemas.
Interacción del proceso
La interacción de 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).
Memoria compartida
La memoria compartida es un medio eficaz 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.
Transmisión de mensajes
En un modelo de paso de mensajes, los procesos paralelos intercambian datos pasando mensajes entre sí. Estas comunicaciones pueden ser asíncronas, 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 del paso de mensajes mediante procesos de comunicación secuencial (CSP) utiliza canales de comunicación sincrónicos para conectar procesos y condujo a lenguajes importantes como Occam, Limbo y Go. Por el contrario, el modelo de actor utiliza el paso de mensajes asíncrono y se ha empleado en el diseño de lenguajes como D, Scala y SALSA.
Espacio de direcciones global particionado
Los modelos de espacio de direcciones global particionado (PGAS) proporcionan un punto medio entre la memoria compartida y el paso de mensajes. PGAS proporciona una abstracción del espacio de direcciones de memoria global que está particionado lógicamente, donde una parte es local para cada proceso. Los procesos paralelos se comunican mediante 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 dividir semánticamente el espacio de direcciones global en porciones con afinidad con procesos particulares, permiten a los programadores explotar la localidad de referencia y permitir una implementación eficiente en computadoras paralelas con memoria distribuida. PGAS es ofrecido por muchos lenguajes y bibliotecas de programación paralela, como Fortran 2008, Chapel, UPC++ y SHMEM.
Interacción implícita
En un modelo implícito, el programador no ve ninguna interacción de proceso y, en cambio, el compilador y/o el tiempo de ejecución son responsables de realizarla. Dos ejemplos de paralelismo implícito son los lenguajes de dominio específico donde se prescribe la concurrencia dentro de operaciones de alto nivel, y los lenguajes de programación funcionales porque la ausencia de efectos secundarios permite que funciones no dependientes se ejecuten en paralelo. Sin embargo, este tipo de paralelismo es difícil de gestionar y los lenguajes funcionales como Concurrent Haskell y Concurrent ML proporcionan funciones para gestionar el paralelismo de forma explícita y correcta.
Descomposición del problema
Un programa paralelo se compone de procesos que se ejecutan simultáneamente. La descomposición del problema se relaciona con la forma en que se formulan los procesos constituyentes.
Paralelismo de tareas
Un modelo de tareas paralelas se centra en procesos o subprocesos de ejecución. Estos procesos a menudo serán conductualmente distintos, lo que enfatiza la necesidad de comunicación. El paralelismo de tareas es una forma natural de expresar la comunicación de transmisión de mensajes. En la taxonomía de Flynn, el paralelismo de tareas suele clasificarse como MIMD/MPMD o MISD.
Paralelismo de datos
Un modelo de datos paralelos se centra en realizar operaciones en un conjunto de datos, normalmente una matriz estructurada regularmente. Un conjunto de tareas operará sobre estos datos, pero de forma independiente en particiones separadas. En la taxonomía de Flynn, el paralelismo de datos suele clasificarse como MIMD/SPMD o SIMD.
Paralelismo de flujo
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 la entrada datos. Cada etapa opera de forma independiente y simultánea, y la salida de una etapa sirve como entrada para la siguiente etapa. El paralelismo de flujo es particularmente adecuado para aplicaciones con flujos de datos continuos o cálculos canalizados.
Paralelismo implícito
Como con la interacción implícita del proceso, un modelo implícito de paralelismo no revela nada al programador como el compilador, el tiempo de ejecución o el hardware es responsable. Por ejemplo, en los compiladores, la paralelización automática es el proceso de convertir el código secuencial en código paralelo, y en la arquitectura de la computadora, la ejecución superscalar es un mecanismo por el cual se explota el paralelismo a nivel de instrucción para realizar operaciones en paralelo.
Terminología
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 tiene que ser práctico, ya que puede implementarse de manera eficiente en hardware y/o software. Un modelo de programación, por el contrario, implica específicamente consideraciones prácticas de implementación de hardware y software.
Un lenguaje de programación paralelo puede basarse en uno o 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 paralelos, y Go proporciona un mecanismo para la interacción de memoria compartida y paso de mensajes.
Ejemplos de programación paralela
Nombre | Clase de interacción | Clase de descomposición | Ejecuciones de ejemplos |
---|---|---|---|
Modelo Actor | Mensaje asombroso que pasa | Tareas | D, Erlang, Scala, SALSA |
Bulk sincrónico paralelo | Memoria compartida | Tareas | Apache Giraph, Apache Hama, BSPlib |
Transmisión de procesos secuenciales | Mensaje sincronizado que pasa | Tareas | Ada, Occam, VerilogCSP, Go |
Circuitos | Mensaje que pasa | Tareas | Verilog, VHDL |
Flujo de datos | Mensaje que pasa | Tareas | Lustre, TensorFlow, Apache Flink |
Funcional | Mensaje que pasa | Tareas | Concurrent Haskell, Concurrent ML |
Máquina de registro | Mensaje sincronizado que pasa | No especificado | Ninguno |
Máquina de acceso aleatoria paralela | Memoria compartida | Datos | Cilk, CUDA, OpenMP, Threading Building Blocks, XMTC |
SPMD PGAS | Planteamiento mundial parcial del espacio | Datos | Fortran 2008, Unified Parallel C, UPC++, SHMEM |
Global-view Task parallelism | Planteamiento mundial parcial del espacio | Tareas | Chapel, X10 |