stringtranslate.com

Modelo de programación paralela

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]

Clasificación de los modelos de programación paralela

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]

Interacción de procesos

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).

Memoria compartida

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.

Paso de mensajes

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.

Espacio de direcciones global particionado

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 .

Interacción implícita

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.

Descomposición del problema

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]

Paralelismo de tareas

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 .

Paralelismo de datos

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 .

Paralelismo de corrientes

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.

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 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.

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 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.

Ejemplos de modelos de programación paralela

Véase también

Referencias

  1. ^ Skillicorn, David B., "Modelos para computación paralela práctica", Revista internacional de programación paralela, 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", Comunicaciones de la ACM, Volumen 33, Número 8, agosto de 1990, páginas 103–111.
  3. ^ John E. Savage, Modelos de computación: exploración del poder de la computación, 2008, Capítulo 7 (Computación paralela), http://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. ^ ab "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 Parallel Architectures and Languages ​​Europe. Springer Berlin Heidelberg, 1987.
  8. ^ "2.2 Particionado". 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

Lectura adicional