Computación paralela
La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la
versión revisada el 5 de octubre de 2014; las comprobaciones requieren
12 ediciones .
La computación paralela es una forma de organizar la computación informática , en la que los programas se desarrollan como un conjunto de procesos informáticos que interactúan y funcionan en paralelo (simultáneamente). El término abarca todos los problemas de paralelismo en la programación , así como la creación de implementaciones de hardware eficientes . La teoría de la computación paralela es una sección de la teoría aplicada de los algoritmos [1] .
Hay varias formas de implementar la computación paralela. Por ejemplo, cada proceso informático se puede implementar como un proceso del sistema operativo , o los procesos informáticos pueden ser un conjunto de subprocesos de ejecución dentro de un único proceso del sistema operativo. Los programas paralelos pueden ejecutarse físicamente ya sea secuencialmente en un solo procesador , alternando a su vez los pasos de ejecución de cada proceso computacional, o en paralelo, asignando uno o más procesadores (ubicados cerca o distribuidos en una red informática ) a cada proceso computacional.
La principal dificultad en el diseño de programas paralelos es asegurar la secuencia correcta de interacciones entre diferentes procesos de cómputo, así como la coordinación de recursos compartidos entre procesos.
Formas de sincronizar la comunicación paralela
En algunos sistemas de programación concurrente, el paso de datos entre componentes está oculto para el programador (por ejemplo, mediante el uso del mecanismo de promesa ), mientras que en otros debe especificarse explícitamente. Las interacciones explícitas se pueden dividir en dos tipos:
- Interacción a través de memoria compartida : en cada procesador de un sistema multiprocesador , se lanza un hilo de ejecución , que pertenece a un proceso. Los hilos intercambian datos a través de un área de memoria compartida para un proceso determinado [2] . El número de subprocesos corresponde al número de procesadores. Los subprocesos se crean por medio del lenguaje (por ejemplo, en Java o C# , C++ (comenzando con C++11 ), C (comenzando con C11 )), o usando bibliotecas explícitamente (por ejemplo, en C/C++ usando PThreads ), o declarativamente (por ejemplo, usando la biblioteca OpenMP), o herramientas de compilación integradas automáticamente (por ejemplo, High Performance Fortran ). Este tipo de programación paralela generalmente requiere alguna forma de captura de control ( mutexes , semáforos , monitores ) para coordinar hilos entre sí.
- Comunicación mediante paso de mensajes : un proceso de un solo subproceso se ejecuta en cada procesador de un sistema multiprocesador y se comunica con otros procesos que se ejecutan en otros procesadores mediante mensajes. Los procesos se crean explícitamente llamando a la función apropiada del sistema operativo, y la mensajería se crea usando una biblioteca (por ejemplo, una implementación del protocolo MPI ) o usando herramientas de lenguaje (por ejemplo, High Performance Fortran , Erlang u occam ). Los mensajes se pueden intercambiar de forma asíncrona o mediante un método de encuentro, en el que se bloquea al remitente hasta que se entrega el mensaje. El paso de mensajes asincrónicos puede ser confiable (con entrega garantizada) o no confiable [3] .
Los sistemas paralelos basados en mensajería suelen ser más fáciles de entender que los sistemas de memoria compartida y generalmente se consideran un método superior de programación paralela. Existe una amplia variedad de teorías matemáticas para el estudio y análisis de los sistemas de paso de mensajes, incluido el modelo de actor y varios tipos de cálculo de procesos . La mensajería se puede implementar de manera efectiva en multiprocesadores simétricos tanto con memoria coherente compartida como sin ella.
El paralelismo de memoria distribuida y el paralelismo de paso de mensajes tienen diferentes características de rendimiento. Por lo general (pero no siempre), la sobrecarga de la memoria de proceso y el tiempo de cambio de tareas es menor para los sistemas con paso de mensajes, pero el paso de mensajes en sí es más sobrecarga que las llamadas a procedimientos. Estas diferencias a menudo son anuladas por otros factores que afectan el rendimiento.
- Método híbrido : en sistemas multiprocesador de memoria distribuida ( DM-MIMD ), donde cada nodo del sistema es un multiprocesador de memoria compartida ( SM-MIMD ), se puede utilizar un método de programación híbrido [4] . En cada nodo del sistema, se inicia un proceso de subprocesos múltiples, que distribuye subprocesos entre los procesadores de este nodo. El intercambio de datos entre hilos en un nodo se lleva a cabo a través de la memoria compartida, y el intercambio de datos entre nodos se lleva a cabo a través del paso de mensajes. En este caso, la cantidad de procesos está determinada por la cantidad de nodos y la cantidad de subprocesos está determinada por la cantidad de procesadores en cada nodo. El método de programación híbrido es más complicado (requiere una reescritura especial del programa paralelo), pero es más eficiente en el uso de los recursos de hardware de cada nodo del sistema multiprocesador.
Por supuesto, en tal sistema, también es posible usar el método de paso de mensajes exclusivamente, es decir, ejecutar un proceso separado en cada procesador de cada nodo. En este caso, la cantidad de procesos (e hilos) será igual a la cantidad de procesadores en todos los nodos. Este método es más simple (en un programa paralelo, solo necesita aumentar la cantidad de procesos), pero es menos eficiente, ya que los procesadores de un mismo nodo intercambiarán mensajes entre sí como si estuvieran en diferentes máquinas
[5] .
Tareas típicas que permiten la computación paralela
- mapa : ejecución de la misma función en cada elemento de la matriz de datos de entrada, obteniendo una matriz de resultados de cálculo de igual potencia
- reducir : ejecutar la misma función para agregar la contribución de cada elemento de la entrada a un valor final
Herramientas de software de concurrencia
- OpenMP es un estándar de interfaz de aplicación para sistemas paralelos de memoria compartida.
- POSIX Threads es un estándar para implementar hilos (threads) de ejecución.
- API de Windows : aplicaciones de subprocesos múltiples para C++.
- PVM (máquina virtual paralela) le permite combinar un conjunto heterogéneo (pero en red) de computadoras en un recurso informático común.
- MPI (Message Passing Interface) es un estándar para sistemas de paso de mensajes entre procesos de ejecución en paralelo.
Véase también
Notas
- ↑ Mikhalevich, 1989 , p. una.
- ↑ Libro rojo, 1999 , pág. una.
- ↑ Libro rojo, 1999 , pág. 2.
- ↑ Libro rojo, 1999 , pág. 5.
- ↑ Libro rojo, 1999 , pág. cuatro
Literatura
Enlaces
diccionarios y enciclopedias |
|
---|