Articulo de referencia

Modelo de programación paralela

En informática , un modelo de programación paralela es una abstracción de la arquitectura de computadoras paralelas , que permite expresar algoritmos y su composición en program...

En informática , un modelo de programación paralela es una abstracción de la arquitectura de computadoras paralelas , que permite expresar algoritmos y su composición en programas . El valor de un modelo de programación se puede evaluar según su generalidad : qué tan bien se puede expresar una variedad de problemas diferentes para diversas arquitecturas, y su rendimiento : qué tan eficientemente se ejecutan los programas compilados. [ 1 ] La implementación de un modelo de programación paralela puede adoptar 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 específico es importante porque conduce a la construcción de diferentes computadoras paralelas compatibles con dicho modelo, facilitando así la portabilidad del software. En este sentido, los modelos de programación se consideran un puente entre el hardware y el software. [ 2 ]

Clasificación de los modelos de programación paralela

Las clasificaciones de los modelos de programación paralela se pueden dividir a grandes rasgos en dos áreas: interacción de procesos y descomposición de problemas. [ 3 ] [ 4 ] [ 5 ]

Interacción del proceso

La interacción entre procesos se refiere a 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 método eficiente para transferir datos entre procesos. En un modelo de memoria compartida, los procesos paralelos comparten un espacio de direcciones global al que leen y escriben de forma asíncrona. El acceso concurrente asíncrono puede provocar 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 aprovechar.

paso de mensajes

En un modelo de paso de mensajes, los procesos paralelos intercambian datos mediante el envío de mensajes entre sí. Estas comunicaciones pueden ser asíncronas, donde un mensaje puede enviarse antes de que el receptor esté listo, o síncronas, donde el receptor debe estar listo. La formalización del paso de mensajes mediante procesos secuenciales comunicantes (CSP) utiliza canales de comunicación síncronos para conectar procesos y dio lugar a lenguajes importantes como Occam , Limbo y Go . En contraste, el modelo de actores 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) ofrecen un punto intermedio entre la memoria compartida y el paso de mensajes. PGAS proporciona una abstracción del espacio de direcciones de memoria global lógicamente particionado, donde una porción es local para cada proceso. Los procesos paralelos se comunican realizando operaciones asíncronas (por ejemplo, lecturas y escrituras) en el espacio de direcciones global, de forma similar a los modelos de memoria compartida. Sin embargo, al particionar semánticamente el espacio de direcciones global en porciones con afinidad a un proceso en particular, permiten a los programadores aprovechar la localidad de referencia y posibilitan una implementación eficiente en computadoras paralelas de memoria distribuida . PGAS está disponible en 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 entre procesos, sino que el compilador o el entorno de ejecución se encargan de llevarla a cabo. Dos ejemplos de paralelismo implícito son los lenguajes específicos de dominio, donde la concurrencia dentro de las operaciones de alto nivel está prescrita, y los lenguajes de programación funcional, ya que la ausencia de efectos secundarios permite que las funciones no dependientes se ejecuten 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 características 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. [ 8 ] [ 5 ]

Paralelismo de tareas

Un modelo de paralelismo de tareas se centra en procesos o hilos de ejecución. Estos procesos suelen ser conductualmente distintos, lo que subraya la necesidad de comunicación. El paralelismo de tareas es una forma natural de expresar la comunicación mediante paso de mensajes. En la taxonomía de Flynn , el paralelismo de tareas se clasifica generalmente como MIMD / MPMD o MISD .

paralelismo de datos

Un modelo de paralelismo de datos se centra en realizar operaciones sobre un conjunto de datos, generalmente 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 se clasifica habitualmente como MIMD / SPMD o SIMD .

Paralelismo de flujo

El paralelismo de flujo, también conocido como paralelismo de tubería, se centra en dividir un cálculo en una secuencia de etapas, donde cada etapa procesa una porción de los datos de entrada. Cada etapa opera de forma independiente y concurrente, y la salida de una etapa sirve como entrada para la siguiente. El paralelismo de flujo es especialmente adecuado para aplicaciones con flujos de datos continuos o cálculos en tubería.

Paralelismo implícito

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 de computadoras, la ejecución superescalar es un mecanismo mediante el cual se aprovecha 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 que se utiliza para analizar el coste de los procesos computacionales, pero no necesariamente tiene que ser práctico, ya que puede implementarse de forma eficiente en hardware y/o software. Un modelo de programación, en cambio, sí implica específicamente las consideraciones prácticas de la implementación en hardware y software. [ 9 ]

Un lenguaje de programación paralela puede basarse en uno o varios modelos de programación. Por ejemplo, Fortran de alto rendimiento se basa en interacciones de memoria compartida y descomposición de problemas en paralelo de datos, y Go proporciona mecanismos para la interacción mediante memoria compartida y paso de mensajes.

Ejemplos de modelos de programación paralela

Véase también

Referencias

  1. Skillicorn, David B., "Modelos para computación paralela práctica", International Journal of Parallel Programming, 20.2 133–158 (1991), https://www.ida.liu.se/~chrke55/papers/modelsurvey.pdf
  2. Leslie G. Valiant, "Un modelo puente para la computación paralela", Communications of the ACM, Volumen 33, Número 8, agosto de 1990, páginas 103–111.
  3. John E. Savage, Models of Computation: Exploring the Power of Computing, 2008, Capítulo 7 (Computación paralela), https://cs.brown.edu/~jes/book/ Archivado el 5 de noviembre de 2016 en Wayback Machine
  4. "1.3 Un modelo de programación paralela" . www.mcs.anl.gov . Consultado el 21 de marzo de 2024 .
  5. 1 2 "Tutorial de introducción a la computación paralela | HPC @ LLNL" . hpc.llnl.gov . Consultado el 21 de marzo de 2024 .
  6. Hammond, Kevin. Programación funcional paralela: una introducción. En Simposio Internacional sobre Computación Simbólica Paralela, pág. 46. 1994.
  7. McBurney, DL y M. Ronan Sleep. «Experimentos basados ​​en transputers con la arquitectura ZAPP». PARLE Arquitecturas y lenguajes paralelos Europa. Springer Berlin Heidelberg, 1987.
  8. "2.2 Particionamiento" . www.mcs.anl.gov . Consultado el 21 de marzo de 2024 .
  9. Skillicorn, David B., y Domenico Talia, Modelos y lenguajes para computación paralela, ACM Computing Surveys, 30.2 123–169 (1998), https://www.cs.utexas.edu/users/browne/CS392Cf2000/papers/ModelsOfParallelComputation-Skillicorn.pdf

Lecturas adicionales

  • Blaise Barney, Introducción a la computación paralela , Laboratorio Nacional Lawrence Livermore, archivado del original el 10 de junio de 2013 , consultado el 22 de noviembre de 2015.
  • Murray I. Cole, Esqueletos algorítmicos: Gestión estructurada de la computación paralela (PDF) , Universidad de Glasgow
  • J. Darlinton; M. Ghanem; HW To (1993). «Programación paralela estructurada». Actas del Taller sobre Modelos de Programación para Computadoras Masivamente Paralelas . págs. 160–169 . doi : 10.1109/PMMP.1993.315543 . ISBN  0-8186-4900-3. S2CID 15265646 . 
  • Ian Foster, Diseño y construcción de programas paralelos , Laboratorio Nacional Argonne