stringtranslate.com

Interfaz de paso de mensajes

La interfaz de paso de mensajes ( MPI ) es un estándar de paso de mensajes estandarizado y portátil diseñado para funcionar en arquitecturas informáticas paralelas . [1] El estándar MPI define la sintaxis y la semántica de las rutinas de biblioteca que son útiles para una amplia gama de usuarios que escriben programas portátiles de paso de mensajes en C , C++ y Fortran . Existen varias implementaciones de MPI de código abierto , que fomentaron el desarrollo de una industria de software paralela y fomentaron el desarrollo de aplicaciones paralelas a gran escala portátiles y escalables.

Historia

El esfuerzo de la interfaz de transmisión de mensajes comenzó en el verano de 1991, cuando un pequeño grupo de investigadores inició conversaciones en un retiro de montaña en Austria. De esa discusión surgió un taller sobre estándares para la transmisión de mensajes en un entorno de memoria distribuida, que se celebró del 29 al 30 de abril de 1992 en Williamsburg, Virginia . [2] Los asistentes a Williamsburg discutieron las características básicas esenciales de una interfaz estándar de paso de mensajes y establecieron un grupo de trabajo para continuar el proceso de estandarización. Jack Dongarra , Tony Hey y David W. Walker presentaron un anteproyecto de propuesta, "MPI1", en noviembre de 1992. En noviembre de 1992, se celebró una reunión del grupo de trabajo MPI en Minneapolis y se decidió situar el proceso de normalización en un plano más amplio. base formal. El grupo de trabajo de MPI se reunió cada 6 semanas durante los primeros 9 meses de 1993. El borrador del estándar MPI se presentó en la conferencia Supercomputing '93 en noviembre de 1993. [3] Después de un período de comentarios públicos, que resultaron en algunos cambios en MPI, La versión 1.0 de MPI se publicó en junio de 1994. Estas reuniones y la discusión por correo electrónico constituyeron en conjunto el Foro MPI, cuya membresía ha estado abierta a todos los miembros de la comunidad de informática de alto rendimiento .

El esfuerzo de MPI involucró a unas 80 personas de 40 organizaciones, principalmente en Estados Unidos y Europa. La mayoría de los principales proveedores de computadoras concurrentes participaron en el esfuerzo de MPI, colaborando con investigadores de universidades, laboratorios gubernamentales y la industria .

MPI proporciona a los proveedores de hardware paralelo un conjunto básico de rutinas claramente definido que se puede implementar de manera eficiente. Como resultado, los proveedores de hardware pueden aprovechar esta colección de rutinas estándar de bajo nivel para crear rutinas de nivel superior para el entorno de comunicación de memoria distribuida suministrado con sus máquinas paralelas . MPI proporciona una interfaz portátil fácil de usar para el usuario básico, pero lo suficientemente potente como para permitir a los programadores utilizar las operaciones de paso de mensajes de alto rendimiento disponibles en máquinas avanzadas.

En un esfuerzo por crear un estándar universal para el paso de mensajes, los investigadores no lo basaron en un solo sistema, sino que incorporaron las características más útiles de varios sistemas, incluidos los diseñados por IBM, Intel , nCUBE , PVM, Express, P4 y PARMACS. . El paradigma de paso de mensajes es atractivo debido a su amplia portabilidad y puede usarse en comunicación para multiprocesadores de memoria distribuida y memoria compartida, redes de estaciones de trabajo y una combinación de estos elementos. El paradigma se puede aplicar en múltiples entornos, independientemente de la velocidad de la red o la arquitectura de la memoria.

El apoyo para las reuniones de MPI provino en parte de DARPA y de la Fundación Nacional de Ciencias de EE. UU. (NSF) bajo la subvención ASC-9310330, el acuerdo cooperativo del Centro de Ciencia y Tecnología de NSF número CCR-8809615, y de la Comisión Europea a través del Proyecto Esprit P6643. La Universidad de Tennessee también hizo contribuciones financieras al Foro MPI.

Descripción general

MPI es un protocolo de comunicación para programar [4] computadoras paralelas . Se admiten comunicaciones punto a punto y colectivas. MPI "es una interfaz de programador de aplicaciones de paso de mensajes, junto con especificaciones semánticas y de protocolo sobre cómo deben comportarse sus características en cualquier implementación". [5] Los objetivos de MPI son alto rendimiento, escalabilidad y portabilidad. MPI sigue siendo el modelo dominante utilizado en la informática de alto rendimiento en la actualidad. [6]

MPI no está aprobado por ningún organismo de normalización importante; sin embargo, se ha convertido en un estándar de facto para la comunicación entre procesos que modelan un programa paralelo que se ejecuta en un sistema de memoria distribuida . Las supercomputadoras de memoria distribuida reales, como los grupos de computadoras, a menudo ejecutan este tipo de programas.

El modelo principal MPI-1 no tiene un concepto de memoria compartida y MPI-2 solo tiene un concepto de memoria compartida distribuida limitada . No obstante, los programas MPI se ejecutan regularmente en computadoras con memoria compartida, y tanto MPICH como Open MPI pueden usar la memoria compartida para la transferencia de mensajes si está disponible. [7] [8] Diseñar programas en torno al modelo MPI (a diferencia de los modelos explícitos de memoria compartida ) tiene ventajas cuando se ejecutan en arquitecturas NUMA, ya que MPI fomenta la localidad de memoria . La programación explícita de memoria compartida se introdujo en MPI-3. [9] [10] [11]

Aunque MPI pertenece a las capas 5 y superiores del modelo de referencia OSI , las implementaciones pueden cubrir la mayoría de las capas, con sockets y protocolo de control de transmisión (TCP) utilizados en la capa de transporte.

La mayoría de las implementaciones de MPI constan de un conjunto específico de rutinas directamente invocables desde C , C++ , Fortran (es decir, una API) y cualquier lenguaje capaz de interactuar con dichas bibliotecas, incluidos C# , Java o Python . Las ventajas de MPI sobre las bibliotecas de paso de mensajes más antiguas son la portabilidad (porque MPI se ha implementado para casi todas las arquitecturas de memoria distribuida) y la velocidad (porque cada implementación está, en principio, optimizada para el hardware en el que se ejecuta).

MPI utiliza especificaciones independientes del idioma (LIS) para llamadas y enlaces de idiomas. El primer estándar MPI especificaba enlaces ANSI C y Fortran-77 junto con el LIS. El borrador se presentó en Supercomputing 1994 (noviembre de 1994) [12] y se finalizó poco después. Alrededor de 128 funciones constituyen el estándar MPI-1.3 que se lanzó como el final de la serie MPI-1 en 2008. [13]

En la actualidad, el estándar tiene varias versiones: la versión 1.3 (comúnmente abreviada MPI-1 ), que enfatiza el paso de mensajes y tiene un entorno de ejecución estático, MPI-2.2 (MPI-2), que incluye nuevas características como E/S paralelas, gestión dinámica de procesos y operaciones de memoria remota, [14] y MPI-3.1 (MPI-3), que incluye extensiones a las operaciones colectivas con versiones sin bloqueo y extensiones a las operaciones unilaterales. [15] El LIS de MPI-2 especifica más de 500 funciones y proporciona enlaces de lenguaje para ISO C , ISO C++ y Fortran 90 . También se agregó interoperabilidad de objetos para permitir una programación más sencilla de paso de mensajes en lenguajes mixtos. Un efecto secundario de la estandarización del MPI-2, completada en 1996, fue la clarificación del estándar MPI-1, creando el MPI-1.2.

MPI-2 es principalmente un superconjunto de MPI-1, aunque algunas funciones han quedado obsoletas. Los programas MPI-1.3 todavía funcionan bajo implementaciones MPI que cumplen con el estándar MPI-2.

MPI-3 incluye nuevos enlaces de Fortran 2008, mientras que elimina enlaces de C++ obsoletos, así como muchas rutinas y objetos MPI obsoletos.

MPI a menudo se compara con la máquina virtual paralela (PVM), que es un entorno distribuido popular y un sistema de paso de mensajes desarrollado en 1989, y que fue uno de los sistemas que motivó la necesidad del paso de mensajes paralelo estándar. Los modelos de programación de memoria compartida con subprocesos (como Pthreads y OpenMP ) y la programación de paso de mensajes (MPI/PVM) pueden considerarse complementarios y se han utilizado juntos en ocasiones, por ejemplo, en servidores con múltiples nodos de memoria compartida de gran tamaño.

Funcionalidad

La interfaz MPI está destinada a proporcionar topología virtual esencial, sincronización y funcionalidad de comunicación entre un conjunto de procesos (que se han asignado a nodos/servidores/instancias de computadora) de una manera independiente del idioma, con sintaxis específica del idioma (enlaces). además de algunas características específicas del idioma. Los programas MPI siempre trabajan con procesos, pero los programadores comúnmente se refieren a los procesos como procesadores. Normalmente, para obtener el máximo rendimiento, a cada CPU (o núcleo en una máquina de varios núcleos) se le asignará un solo proceso. Esta asignación ocurre en tiempo de ejecución a través del agente que inicia el programa MPI, normalmente llamado mpirun o mpiexec.

Las funciones de la biblioteca MPI incluyen, entre otras, operaciones de envío/recepción de tipo encuentro punto a punto, elección entre una topología de proceso lógica cartesiana o tipo gráfico , intercambio de datos entre pares de procesos (operaciones de envío/recepción), combinación de resultados de cálculos (operaciones de recopilación y reducción), sincronización de nodos (operación de barrera), así como la obtención de información relacionada con la red, como el número de procesos en la sesión informática, la identidad actual del procesador al que está asignado un proceso, los procesos vecinos accesibles en un topología lógica, etc. Las operaciones punto a punto vienen en formas sincrónicas , asincrónicas , almacenadas en búfer y listas , para permitir una semántica relativamente más fuerte y más débil para los aspectos de sincronización de un envío de encuentro. Muchas operaciones pendientes [ se necesita aclaración ] son ​​posibles en modo asíncrono, en la mayoría de las implementaciones.

Tanto MPI-1 como MPI-2 permiten implementaciones que superponen la comunicación y la computación, pero la práctica y la teoría difieren. MPI también especifica interfaces seguras para subprocesos , que tienen estrategias de cohesión y acoplamiento que ayudan a evitar estados ocultos dentro de la interfaz. Es relativamente fácil escribir código MPI punto a punto multiproceso y algunas implementaciones admiten dicho código. La comunicación colectiva multiproceso se logra mejor con varias copias de Comunicadores, como se describe a continuación.

Conceptos

MPI proporciona varias funciones. Los siguientes conceptos proporcionan contexto para todas esas habilidades y ayudan al programador a decidir qué funcionalidad usar en sus programas de aplicación. Cuatro de los ocho conceptos básicos de MPI son exclusivos de MPI-2.

Comunicador

Los objetos del comunicador conectan grupos de procesos en la sesión MPI. Cada comunicador proporciona a cada proceso contenido un identificador independiente y organiza sus procesos contenidos en una topología ordenada . MPI también tiene grupos explícitos, pero estos son principalmente buenos para organizar y reorganizar grupos de procesos antes de que se cree otro comunicador. MPI comprende las operaciones de intracomunicadores de un solo grupo y la comunicación de intercomunicadores bilaterales. En MPI-1, las operaciones de un solo grupo son las más frecuentes. Las operaciones bilaterales aparecen principalmente en MPI-2, donde incluyen comunicación colectiva y gestión dinámica en el proceso.

Los comunicadores se pueden particionar mediante varios comandos MPI. Estos comandos incluyen MPI_COMM_SPLIT, donde cada proceso se une a uno de varios subcomunicadores de colores al declararse que tiene ese color.

Conceptos básicos punto a punto

Varias funciones importantes de MPI implican la comunicación entre dos procesos específicos. Un ejemplo popular es MPI_Send, que permite que un proceso específico envíe un mensaje a un segundo proceso específico. Las operaciones punto a punto, como se las denomina, son particularmente útiles en comunicaciones con patrones o irregulares, por ejemplo, una arquitectura de datos paralelos en la que cada procesador intercambia rutinariamente regiones de datos con otros procesadores específicos entre pasos de cálculo, o un maestro. Arquitectura esclava en la que el maestro envía nuevos datos de tareas a un esclavo cada vez que se completa la tarea anterior.

MPI-1 especifica mecanismos para mecanismos de comunicación punto a punto tanto de bloqueo como de no bloqueo, así como el llamado mecanismo de "envío listo" mediante el cual se puede realizar una solicitud de envío solo cuando ya se ha realizado la solicitud de recepción coincidente. .

Conceptos básicos colectivos

Las funciones colectivas implican la comunicación entre todos los procesos de un grupo de procesos (lo que puede significar todo el grupo de procesos o un subconjunto definido por el programa). Una función típica es la MPI_Bcastllamada (abreviatura de " difusión "). Esta función toma datos de un nodo y los envía a todos los procesos del grupo de procesos. Una operación inversa es la MPI_Reducellamada, que toma datos de todos los procesos de un grupo, realiza una operación (como la suma) y almacena los resultados en un nodo. MPI_ReduceSuele ser útil al principio o al final de un cálculo distribuido grande, donde cada procesador opera en una parte de los datos y luego los combina en un resultado.

Otras operaciones realizan tareas más sofisticadas, como MPI_Alltoallreorganizar n elementos de datos de modo que el enésimo nodo obtenga el enésimo elemento de datos de cada uno.

Tipos de datos derivados

Muchas funciones MPI requieren que especifique el tipo de datos que se envían entre procesos. Esto se debe a que MPI tiene como objetivo soportar entornos heterogéneos donde los tipos pueden representarse de manera diferente en los diferentes nodos [16] (por ejemplo, pueden estar ejecutando diferentes arquitecturas de CPU que tienen diferente endianidad ), en cuyo caso las implementaciones de MPI pueden realizar la conversión de datos . [16] Dado que el lenguaje C no permite pasar un tipo en sí como parámetro, MPI predefine las constantes MPI_INT, MPI_CHAR, MPI_DOUBLEpara que se correspondan con int, char, double, etc.

Aquí hay un ejemplo en C que pasa matrices de ints de todos los procesos a uno. El proceso receptor se llama proceso "raíz" y puede ser cualquier proceso designado, pero normalmente será el proceso 0. Todos los procesos solicitan enviar sus matrices a la raíz con MPI_Gather, lo que equivale a tener cada proceso (incluido el raíz misma) llama MPI_Sendy la raíz realiza el número correspondiente de MPI_Recvllamadas ordenadas para ensamblar todas estas matrices en una más grande: [17]

int enviar_array [ 100 ]; raíz entera = 0 ; /* o lo que sea */ int num_procs , * recv_array ; MPI_Comm_size ( comunicación y num_procs ) ; recv_array = malloc ( num_procs * sizeof ( send_array )); MPI_Gather ( send_array , tamaño de ( send_array ) / tamaño de ( * send_array ), MPI_INT , recv_array , tamaño de ( send_array ) / tamaño de ( * send_array ), MPI_INT , raíz , comm );                       

Sin embargo, es posible que desee enviar datos como un bloque en lugar de 100 ints. Para hacer esto, defina un tipo de datos derivado de "bloque contiguo":

MPI_Datatype nuevo tipo ; MPI_Type_contiguous ( 100 , MPI_INT y nuevo tipo ) ; MPI_Type_commit ( & nuevo tipo ); MPI_Gather ( matriz , 1 , nuevo tipo , recibir_matriz , 1 , nuevo tipo , raíz , comunicación );          

Para pasar una clase o una estructura de datos, MPI_Type_create_structcrea un tipo de datos derivado de MPI a partir de MPI_predefinedtipos de datos, de la siguiente manera:

int MPI_Type_create_struct ( int recuento , int * blocklen , MPI_Aint * disp , MPI_Datatype * tipo , MPI_Datatype * nuevo tipo )          

dónde:

La dispmatriz (desplazamientos) es necesaria para la alineación de la estructura de datos , ya que el compilador puede rellenar las variables en una clase o estructura de datos. La forma más segura de encontrar la distancia entre diferentes campos es obteniendo sus direcciones en la memoria. Esto se hace con MPI_Get_address, que normalmente es el mismo que el operador de C, &pero puede que no sea cierto cuando se trata de segmentación de memoria . [18]

Pasar una estructura de datos como un bloque es significativamente más rápido que pasar un elemento a la vez, especialmente si la operación se va a repetir. Esto se debe a que los bloques de tamaño fijo no requieren serialización durante la transferencia. [19]

Dadas las siguientes estructuras de datos:

estructura A { int f ; p corta ; };      estructura B { estructura A a ; intpp , vp ;};        

Aquí está el código C para crear un tipo de datos derivado de MPI:

estática constante int blocklen [] = { 1 , 1 , 1 , 1 }; estática constante MPI_Aint disp [ ] = { desplazamiento de ( estructura B , a ) + desplazamiento de ( estructura A , f ), desplazamiento de ( estructura B , a ) + desplazamiento de ( estructura A , p ), desplazamiento de ( estructura B , pp ), desplazamiento de ( estructura B , vp ) }; tipo de tipo de datos MPI_estático [ ] = { MPI_INT , MPI_SHORT , MPI_INT , MPI_INT }; MPI_Datatype nuevo tipo ; MPI_Type_create_struct ( tamaño de ( tipo ) / tamaño de ( * tipo ), blocklen , disp , tipo y nuevo tipo ); MPI_Type_commit ( & nuevo tipo );                                               

Conceptos de MPI-2

Comunicación unilateral

MPI-2 define tres operaciones de comunicación unilateral, MPI_Put, MPI_Gety MPI_Accumulate, que son una escritura en la memoria remota, una lectura desde la memoria remota y una operación de reducción en la misma memoria en varias tareas, respectivamente. También se definen tres métodos diferentes para sincronizar esta comunicación (bloqueos globales, por pares y remotos), ya que la especificación no garantiza que estas operaciones hayan tenido lugar hasta un punto de sincronización.

Estos tipos de llamadas a menudo pueden ser útiles para algoritmos en los que la sincronización sería inconveniente (por ejemplo, multiplicación de matrices distribuidas ), o donde es deseable que las tareas puedan equilibrar su carga mientras otros procesadores operan con datos.

Gestión dinámica de procesos

El aspecto clave es "la capacidad de un proceso MPI para participar en la creación de nuevos procesos MPI o para establecer comunicación con procesos MPI que se han iniciado por separado". La especificación MPI-2 describe tres interfaces principales mediante las cuales los procesos MPI pueden establecer comunicaciones dinámicamente, MPI_Comm_spawn, MPI_Comm_accept/ MPI_Comm_connecty MPI_Comm_join. La MPI_Comm_spawninterfaz permite que un proceso MPI genere varias instancias del proceso MPI nombrado. El conjunto de procesos MPI recién generado forma un nuevo MPI_COMM_WORLDintracomunicador, pero puede comunicarse con el padre y el intercomunicador que devuelve la función. MPI_Comm_spawn_multiplees una interfaz alternativa que permite que las diferentes instancias generadas sean binarios diferentes con argumentos diferentes. [20]

E/S

La función de E/S paralela a veces se denomina MPI-IO [21] y se refiere a un conjunto de funciones diseñadas para abstraer la gestión de E/S en sistemas distribuidos a MPI y permitir que se acceda fácilmente a los archivos de forma pautada utilizando el sistema existente. funcionalidad de tipo de datos derivado.

La poca investigación que se ha realizado sobre esta característica indica que puede que no sea trivial obtener ganancias de alto rendimiento mediante el uso de MPI-IO. Por ejemplo, una implementación de multiplicaciones dispersas de matrices y vectores utilizando la biblioteca MPI I/O muestra un comportamiento general de ganancia de rendimiento menor, pero estos resultados no son concluyentes. [22] No fue hasta que la idea de E/S colectiva [23] implementada en MPI-IO que MPI-IO comenzó a alcanzar una adopción generalizada. La E/S colectiva aumenta sustancialmente el ancho de banda de E/S de las aplicaciones al hacer que los procesos transformen colectivamente las operaciones de E/S pequeñas y no contiguas en operaciones grandes y contiguas, reduciendo así el bloqueo y la sobrecarga de búsqueda de disco. Debido a sus enormes beneficios de rendimiento, MPI-IO también se convirtió en la capa de E/S subyacente para muchas bibliotecas de E/S de última generación, como HDF5 y Parallel NetCDF . Su popularidad también desencadenó investigaciones sobre optimizaciones de E/S colectivas, como E/S con reconocimiento de diseño [24] y agregación entre archivos. [25] [26]

Implementaciones oficiales

Muchos otros esfuerzos se derivan de MPICH, LAM y otros trabajos, incluidas, entre otras, implementaciones comerciales de HPE , Intel , Microsoft y NEC .

Si bien las especificaciones exigen una interfaz C y Fortran, el lenguaje utilizado para implementar MPI no está obligado a coincidir con el lenguaje o los lenguajes que busca admitir en tiempo de ejecución. La mayoría de las implementaciones combinan C, C++ y lenguaje ensamblador, y están dirigidas a programadores de C, C++ y Fortran. Hay enlaces disponibles para muchos otros lenguajes, incluidos Perl, Python, R, Ruby, Java y CL (consulte #Enlaces de idiomas).

El ABI de las implementaciones de MPI se divide aproximadamente entre MPICH y los derivados de Open MPI , de modo que una biblioteca de una familia funciona como reemplazo directo de una de la misma familia, pero el reemplazo directo entre familias es imposible. La CEA francesa mantiene una interfaz contenedora para facilitar dichos cambios. [27]

Hardware

La investigación de hardware MPI se centra en implementar MPI directamente en el hardware, por ejemplo mediante procesador en memoria , incorporando operaciones MPI en los microcircuitos de los chips RAM de cada nodo. Por implicación, este enfoque es independiente del idioma, el sistema operativo y la CPU, pero no se puede actualizar ni eliminar fácilmente.

Otro enfoque ha sido agregar aceleración de hardware a una o más partes de la operación, incluido el procesamiento de hardware de las colas MPI y el uso de RDMA para transferir datos directamente entre la memoria y el controlador de interfaz de red sin intervención de la CPU o del kernel del sistema operativo.

Envoltorios del compilador

mpicc (y de manera similar mpic++ , mpif90 , etc.) es un programa que incluye un compilador existente para configurar los indicadores de línea de comandos necesarios al compilar código que usa MPI. Por lo general, agrega algunas opciones que permiten que el código se compile y vincule con la biblioteca MPI. [28]

Enlaces de idiomas

Los enlaces son bibliotecas que extienden el soporte de MPI a otros lenguajes al empaquetar una implementación de MPI existente, como MPICH u Open MPI.

Infraestructura de lenguaje común

Las dos implementaciones administradas de Common Language Infrastructure .NET son Pure Mpi.NET [29] y MPI.NET, [30] un esfuerzo de investigación de la Universidad de Indiana con licencia estilo BSD . Es compatible con Mono y puede aprovechar al máximo las estructuras de red MPI subyacentes de baja latencia.

Java

Aunque Java no tiene un enlace MPI oficial, varios grupos intentan unir los dos, con diferentes grados de éxito y compatibilidad. Uno de los primeros intentos fue mpiJava de Bryan Carpenter, [31] esencialmente un conjunto de envoltorios de interfaz nativa de Java (JNI) para una biblioteca C MPI local, lo que dio como resultado una implementación híbrida con portabilidad limitada, que también debe compilarse con el MPI específico. biblioteca que se utiliza.

Sin embargo, este proyecto original también definió la API mpiJava [32] (una API MPI de facto para Java que seguía de cerca los enlaces equivalentes de C++) que otros proyectos Java MPI posteriores adoptaron. Una API menos utilizada es la API MPJ, que fue diseñada para estar más orientada a objetos y más cercana a las convenciones de codificación de Sun Microsystems . [33] Más allá de la API, las bibliotecas MPI de Java pueden depender de una biblioteca MPI local o implementar funciones de paso de mensajes en Java, mientras que algunas como P2P-MPI también proporcionan funcionalidad de igual a igual y permiten la operación en plataformas mixtas.

Algunas de las partes más desafiantes de Java/MPI surgen de características de Java como la falta de punteros explícitos y el espacio de direcciones de memoria lineal para sus objetos, que hacen que la transferencia de matrices multidimensionales y objetos complejos sea ineficiente. Las soluciones generalmente implican transferir una línea a la vez y/o realizar una deserialización y conversión explícitas tanto en el extremo emisor como en el receptor, simulando matrices tipo C o Fortran mediante el uso de una matriz unidimensional y punteros a tipos primitivos mediante el uso de matrices de un solo elemento, lo que da como resultado estilos de programación bastante alejados de las convenciones de Java.

Otro sistema de paso de mensajes Java es MPJ Express. [34] Las versiones recientes se pueden ejecutar en configuraciones de clúster y multinúcleo. En la configuración del clúster, puede ejecutar aplicaciones Java paralelas en clústeres y nubes. Aquí, los sockets Java o las interconexiones de E/S especializadas como Myrinet pueden admitir mensajería entre procesos MPJ Express. También puede utilizar la implementación C nativa de MPI utilizando su dispositivo nativo. En la configuración multinúcleo, se ejecuta una aplicación Java paralela en procesadores multinúcleo. En este modo, los procesos MPJ Express están representados por subprocesos Java.

Julia

Hay un contenedor de lenguaje Julia para MPI. [35]

MATLAB

Existen algunas implementaciones académicas de MPI utilizando MATLAB . MATLAB tiene su propia biblioteca de extensiones paralela implementada mediante MPI y PVM .

OCaml

El módulo OCamlMPI [36] implementa un gran subconjunto de funciones MPI y se utiliza activamente en informática científica. Se "MPI-ificó" un programa OCaml de 11.000 líneas utilizando el módulo, con 500 líneas adicionales de código y una ligera reestructuración, y se ejecutó con excelentes resultados en hasta 170 nodos en una supercomputadora. [37]

PARI/GP

PARI/GP se puede construir [38] para usar MPI como motor multiproceso, lo que permite ejecutar programas PARI y GP paralelos en clústeres MPI sin modificaciones.

Pitón

Las implementaciones de MPI en Python incluyen: pyMPI , mpi4py, [39] pypar, [40] MYMPI, [41] y el submódulo MPI en ScientificPython . pyMPI se destaca porque es una variante del intérprete de Python, mientras que pypar, MYMPI y el módulo de ScientificPython son módulos de importación. Hacen que sea trabajo del codificador decidir a dónde MPI_Initpertenece la llamada.

En 2006 [42] las bibliotecas Boost C++ adquirieron Boost:MPI, que incluía los enlaces MPI Python. [43] Esto es de particular ayuda para mezclar C++ y Python. En octubre de 2016, Boost: los enlaces Python de MPI todavía tienen errores de empaquetado sin corregir en CentOS . [44]

R

Los enlaces R de MPI incluyen Rmpi ​​[45] y pbdMPI , [46] donde Rmpi ​​se centra en el paralelismo gerente-trabajadores mientras que pbdMPI se centra en el paralelismo SPMD . Ambas implementaciones son totalmente compatibles con Open MPI o MPICH2 .

Programa de ejemplo

Aquí hay un "¡Hola mundo!" programa en MPI escrito en C. En este ejemplo, enviamos un mensaje de "hola" a cada procesador, lo manipulamos trivialmente, devolvemos los resultados al proceso principal e imprimimos los mensajes.

/*  Programa de prueba MPI "Hola mundo" */ #include <assert.h> #include <stdio.h> #include <string.h> #include <mpi.h>    int principal ( int argc , char ** argv ) { char buf [ 256 ]; int mi_rango , num_procs ;          /* Inicializa la infraestructura necesaria para la comunicación */ MPI_Init ( & argc , & argv );   /* Identificar este proceso */ MPI_Comm_rank ( MPI_COMM_WORLD , & my_rank );   /* Descubra cuántos procesos totales están activos */ MPI_Comm_size ( MPI_COMM_WORLD , & num_procs );   /* Hasta este punto, todos los programas han estado haciendo exactamente lo mismo.  Aquí, verificamos el rango para distinguir las funciones de los programas */ if ( my_rank == 0 ) { int other_rank ; printf ( "Tenemos %i procesos. \n " , num_procs );          /* Enviar mensajes a todos los demás procesos */ for ( other_rank = 1 ; other_rank < num_procs ; other_rank ++ ) { sprintf ( buf , "¡Hola %i!" , other_rank ); MPI_Send ( buf , 256 , MPI_CHAR , other_rank , 0 , MPI_COMM_WORLD ); }                    /* Recibir mensajes de todos los demás procesos */ for ( other_rank = 1 ; other_rank < num_procs ; other_rank ++ ) { MPI_Recv ( buf , 256 , MPI_CHAR , other_rank , 0 , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); printf ( "%s \n " , buf ); }                    } demás {   /* Recibir mensaje del proceso #0 */ MPI_Recv ( buf , 256 , MPI_CHAR , 0 , 0 , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); afirmar ( memcmp ( buf , "Hola" , 6 ) == 0 );             /* Enviar mensaje al proceso #0 */ sprintf ( buf , "Proceso %i reportándose para servicio." , my_rank ); MPI_Send ( buf , 256 , MPI_CHAR , 0 , 0 , MPI_COMM_WORLD );          } /* Derribar la infraestructura de comunicación */ MPI_Finalize (); devolver 0 ; }   

Cuando se ejecuta con 4 procesos, debería producir el siguiente resultado: [47]

$ mpicc ejemplo.c && mpiexec -n 4 ./a.outContamos con 4 procesos.Proceso 1 reportándose al servicio.Proceso 2 reportándose al servicio.Proceso 3 reportándose al servicio.

Aquí mpiexecse muestra un comando utilizado para ejecutar el programa de ejemplo con 4 procesos , cada uno de los cuales es una instancia independiente del programa en tiempo de ejecución y tiene rangos asignados (es decir, ID numéricos) 0, 1, 2 y 3. El nombre mpiexeces recomendado por el estándar MPI, aunque algunas implementaciones proporcionan un comando similar con el nombre mpirun. El MPI_COMM_WORLDes el comunicador que consta de todos los procesos.

De este modo se facilita, pero no es necesario, un modelo de programación de programa único y datos múltiples ( SPMD ); Muchas implementaciones de MPI permiten iniciar múltiples ejecutables diferentes en el mismo trabajo MPI. Cada proceso tiene su propio rango, el número total de procesos en el mundo y la capacidad de comunicarse entre ellos ya sea con comunicación punto a punto (envío/recepción) o mediante comunicación colectiva entre el grupo. Es suficiente que MPI proporcione un programa estilo SPMD con MPI_COMM_WORLDsu propio rango y el tamaño del mundo para permitir que los algoritmos decidan qué hacer. En situaciones más realistas, la E/S se gestiona con más cuidado que en este ejemplo. MPI no estipula cómo deben funcionar las E/S estándar (stdin, stdout, stderr) en un sistema determinado. Generalmente funciona como se esperaba en el proceso de rango 0 y algunas implementaciones también capturan y canalizan el resultado de otros procesos.

MPI utiliza la noción de proceso en lugar de procesador. Las copias del programa se asignan a los procesadores mediante el tiempo de ejecución de MPI . En ese sentido, la máquina paralela puede asignarse a un procesador físico, o a N procesadores, donde N es el número de procesadores disponibles, o incluso algo intermedio. Para una máxima velocidad paralela, se utilizan más procesadores físicos. Este ejemplo ajusta su comportamiento al tamaño del mundo N , por lo que también busca escalar a la configuración de tiempo de ejecución sin compilación para cada variación de tamaño, aunque las decisiones de tiempo de ejecución pueden variar según la cantidad absoluta de simultaneidad disponible.

Adopción de MPI-2

La adopción de MPI-1.2 ha sido universal, particularmente en la computación en clúster, pero la aceptación de MPI-2.1 ha sido más limitada. Los problemas incluyen:

  1. Las implementaciones de MPI-2 incluyen E/S y gestión dinámica de procesos, y el tamaño del middleware es sustancialmente mayor. La mayoría de los sitios que utilizan sistemas de programación por lotes no pueden admitir la gestión dinámica de procesos. Las E/S paralelas del MPI-2 son bien aceptadas. [ cita necesaria ]
  2. Muchos programas MPI-1.2 se desarrollaron antes de MPI-2. Las preocupaciones sobre la portabilidad inicialmente desaceleraron la adopción, aunque un apoyo más amplio la ha disminuido.
  3. Muchas aplicaciones MPI-1.2 utilizan sólo un subconjunto de ese estándar (16-25 funciones) sin necesidad real de la funcionalidad MPI-2.

Futuro

Algunos aspectos del futuro del MPI parecen sólidos; otros menos. El Foro MPI se volvió a reunir en 2007 para aclarar algunas cuestiones de MPI-2 y explorar desarrollos para un posible MPI-3, lo que resultó en las versiones MPI-3.0 (septiembre de 2012) y MPI-3.1 (junio de 2015).

Las arquitecturas están cambiando, con una mayor concurrencia interna ( multinúcleo ), un mejor control de concurrencia detallado (subprocesos, afinidad) y más niveles de jerarquía de memoria . Los programas multiproceso pueden aprovechar estos desarrollos más fácilmente que las aplicaciones de un solo subproceso. Esto ya ha dado lugar a estándares independientes y complementarios para el multiprocesamiento simétrico , concretamente OpenMP . MPI-2 define cómo las implementaciones que cumplen con los estándares deben abordar los problemas de subprocesos múltiples, pero no requiere que las implementaciones sean multiproceso, ni siquiera seguras para subprocesos. MPI-3 agrega la capacidad de utilizar paralelismo de memoria compartida dentro de un nodo. Las implementaciones de MPI, como MPI adaptativo, MPI híbrido, MPI de grano fino, MPC y otras, ofrecen extensiones al estándar MPI que abordan diferentes desafíos en MPI.

El astrofísico Jonathan Dursi escribió un artículo de opinión calificando a MPI como obsoleto, señalando tecnologías más nuevas como el lenguaje Chapel , Unified Parallel C , Hadoop , Spark y Flink . [48] ​​Al mismo tiempo, casi todos los proyectos del Exascale Computing Project se basan explícitamente en MPI; Se ha demostrado que MPI escala a las máquinas más grandes a principios de la década de 2020 y se considera que seguirá siendo relevante durante mucho tiempo.

Ver también

Referencias

  1. ^ "Interfaz de paso de mensajes :: Computación de alto rendimiento". hpc.nmsu.edu . Consultado el 6 de agosto de 2022 .
  2. ^ Walker DW (agosto de 1992). Estándares para el paso de mensajes en un entorno de memoria distribuida (PDF) (Reporte). Oak Ridge National Lab., TN (Estados Unidos), Centro de Investigación en Computación Paralela (CRPC). pag. 25. OSTI  10170156. ORNL/TM-12147 . Consultado el 18 de agosto de 2019 .
  3. ^ Foro MPI, CORPORATIVO (15 al 19 de noviembre de 1993). "MPI: una interfaz de paso de mensajes". Actas de la conferencia ACM/IEEE de 1993 sobre supercomputación . Supercomputación '93. Portland, Oregón, Estados Unidos: ACM. págs. 878–883. doi :10.1145/169627.169855. ISBN 0-8186-4340-4.
  4. ^ Nielsen, Frank (2016). "2. Introducción a MPI: la interfaz de paso de mensajes". Introducción a HPC con MPI para Ciencia de Datos. Saltador. págs. 195-211. ISBN 978-3-319-21903-5.
  5. ^ Gropp, Lusk y Skjellum 1996, pág. 3
  6. ^ Sur, Sayantán; Koop, Mateo J.; Panda, Dhabaleswar K. (4 de agosto de 2017). "MPI y comunicación --- MPI escalable y de alto rendimiento sobre InfiniBand con uso reducido de memoria: un análisis de rendimiento en profundidad". Actas de la conferencia ACM/IEEE de 2006 sobre supercomputación - SC '06 . ACM. pag. 105. doi :10.1145/1188455.1188565. ISBN 978-0769527000. S2CID  818662.
  7. ^ KNEM: comunicación MPI dentro del nodo de alto rendimiento "MPICH2 (desde la versión 1.1.1) utiliza KNEM en DMA LMT para mejorar el rendimiento de mensajes grandes dentro de un solo nodo. Open MPI también incluye soporte KNEM en su componente SM BTL desde la versión 1.5 Además, NetPIPE incluye un backend KNEM desde la versión 3.7.2."
  8. ^ "Preguntas frecuentes: ajuste de las características de tiempo de ejecución de las comunicaciones MPI sm". www.open-mpi.org .
  9. ^ https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en "El estándar MPI-3 introduce otro enfoque para la programación híbrida que utiliza el nuevo modelo MPI Shared Memory (SHM)"
  10. ^ Memoria compartida y MPI 3.0 "Se pueden ejecutar varios puntos de referencia para determinar qué método es mejor para una aplicación en particular, ya sea usando MPI + OpenMP o las extensiones MPI SHM. En un caso de prueba bastante simple, las aceleraciones con respecto a una versión base que solía apuntar a La comunicación de puntos fue hasta 5 veces mayor, dependiendo del mensaje".
  11. ^ Uso de la memoria compartida MPI-3 como sistema de programación multinúcleo (diapositivas de presentación en PDF)
  12. ^ Índice de contenidos, septiembre de 1994, 8 (3-4). Hpc.sagepub.com. Recuperado el 24 de marzo de 2014.
  13. ^ Documentos MPI. Mpi-forum.org. Recuperado el 24 de marzo de 2014.
  14. ^ Gropp, Lusk y Skjellum 1999b, págs. 4-5
  15. ^ MPI: una interfaz estándar de paso de mensajes, versión 3.1, Foro de interfaz de paso de mensajes, 4 de junio de 2015. http://www.mpi-forum.org. Recuperado el 16 de junio de 2015.
  16. ^ ab "Reglas de coincidencia de tipos". mpi-forum.org .
  17. ^ "Página de manual de MPI_Gather(3) (versión 1.8.8)". www.open-mpi.org .
  18. ^ "MPI_Get_address". www.mpich.org .
  19. ^ Justificación del mecanismo de contenido/esqueleto de Boost.MPI (los gráficos de comparación de rendimiento se produjeron utilizando NetPIPE )
  20. ^ Gropp, Lusk y Skjelling 1999b, pág. 7
  21. ^ Gropp, Lusk y Skjelling 1999b, págs. 5-6
  22. ^ "Multiplicaciones dispersas de vectores de matriz utilizando la biblioteca de E/S MPI" (PDF) .
  23. ^ "Tamizado de datos y E/S colectiva en ROMIO" (PDF) . IEEE. Febrero de 1999.
  24. ^ Chen, Yong; Sol, Xian-He; Thakur, Rajeev; Roth, Philip C.; Gropp, William D. (septiembre de 2011). "LACIO: una nueva estrategia de E/S colectiva para sistemas de E/S paralelos". Simposio internacional de procesamiento distribuido y paralelo del IEEE 2011 . IEEE. págs. 794–804. CiteSeerX 10.1.1.699.8972 . doi :10.1109/IPDPS.2011.79. ISBN  978-1-61284-372-8. S2CID  7110094.
  25. ^ Teng Wang; Kevin Vasko; Zhuo Liu; Hui Chen; Weikuan Yu (2016). "Mejorar la entrada/salida paralela con agregación entre paquetes". La revista internacional de aplicaciones informáticas de alto rendimiento . 30 (2): 241–256. doi :10.1177/1094342015618017. S2CID  12067366.
  26. ^ Wang, Teng; Vasko, Kevin; Liu, Zhuo; Chen, Hui; Yu, Weikuan (noviembre de 2014). "BPAR: un marco de agregación paralelo basado en paquetes para la ejecución de E/S desacopladas". 2014 Taller internacional sobre sistemas informáticos escalables con uso intensivo de datos . IEEE. págs. 25-32. doi :10.1109/DISCOS.2014.6. ISBN 978-1-4673-6750-9. S2CID  2402391.
  27. ^ cea-hpc. "cea-hpc/wi4mpi: interfaz contenedora para MPI". GitHub .
  28. ^ mpcc. Mpich.org. Recuperado el 24 de marzo de 2014.
  29. ^ Puro Mpi.NET
  30. ^ "MPI.NET: biblioteca C# de alto rendimiento para paso de mensajes". www.osl.iu.edu .
  31. ^ "Página de inicio de mpiJava". www.hpjava.org .
  32. ^ "Introducción a la API mpiJava". www.hpjava.org .
  33. ^ "La especificación API MPJ". www.hpjava.org .
  34. ^ "Proyecto MPJ Express". mpj-express.org .
  35. ^ JuliaParallel/MPI.jl, Julia paralela, 3 de octubre de 2019 , consultado el 8 de octubre de 2019
  36. ^ "Xavier Leroy-Software". cristal.inria.fr .
  37. ^ Archivos de la lista de correo de Caml > Mensaje de Yaron M. Minsky. Caml.inria.fr (15 de julio de 2003). Recuperado el 24 de marzo de 2014.
  38. ^ "Introducción al GP paralelo" (PDF) . pari.math.u-bordeaux.fr .
  39. ^ "Google Code Archive: almacenamiento a largo plazo para el alojamiento de proyectos de Google Code". código.google.com .
  40. ^ "Google Code Archive: almacenamiento a largo plazo para el alojamiento de proyectos de Google Code". código.google.com .
  41. ^ Ahora parte de Pydusa
  42. ^ "Historial de revisiones de Boost.MPI". www.boost.org .
  43. ^ "Enlaces de Python - 1.35.0". www.boost.org .
  44. ^ "0006498: Falta el módulo Python del paquete boost-*mpi-python - CentOS Bug Tracker". bugs.centos.org .
  45. ^ Yu, Hao (2002). "Rmpi: Computación estadística paralela en R". Noticias R.
  46. ^ Chen, Wei-Chen; Ostrouchov, George; Schmidt, dibujó; Patel, Pragneshkumar; Yu, Hao (2012). "pbdMPI: Programación con Big Data - Interfaz para MPI".
  47. ^ El fragmento de salida se produjo en un sistema de escritorio Linux normal con Open MPI instalado. Las distribuciones generalmente colocan el comando mpicc en un paquete openmpi-devel o libopenmpi-dev y, a veces, hacen necesario ejecutar "module add mpi/openmpi-x86_64" o similar antes de que mpicc y mpiexec estén disponibles.
  48. ^ "HPC está muriendo y MPI lo está acabando". www.dursi.ca .

Otras lecturas

enlaces externos