fbpx
Wikipedia

Interfaz de Paso de Mensajes

La interfaz de paso de mensajes o MPI (sigla del inglés message passing interface) es un estándar que define la sintaxis y la semántica de las funciones contenidas en una biblioteca de paso de mensajes diseñada para ser usada en programas que exploten la existencia de múltiples procesadores. escritos generalmente C, C++, Fortran y Ada. La ventaja de MPI sobre otras bibliotecas de paso de mensajes, es que los programas que utilizan la biblioteca son portables (dado que MPI ha sido implementado para casi toda arquitectura de memoria distribuida), y rápidos, (porque cada implementación de la biblioteca ha sido optimizada para el hardware en la cual se ejecuta).

Historia

Al diseñarse la interfaz de paso de mensajes se tuvieron en cuenta las características más atractivas de los sistemas existentes para el paso de mensajes, en vez de seleccionar uno solo de ellos y adoptarlo como el estándar, resultando así, en una fuerte influencia para MPI los trabajos hechos por IBM, INTEL, NX/, Express, nCUBE's Vernex, p4 y PARMACS. Otras contribuciones importantes provienen de Zipcode, Chimp, PVM, Chameleon y PICL.

El esfuerzo para estandarizar MPI involucró a cerca de 60 personas de 40 organizaciones diferentes principalmente de EE. UU. y Europa.

La mayoría de los vendedores de computadoras concurrentes estaban involucrados con MPI, así como con investigadores de diferentes universidades, laboratorios del gobierno e industrias.

El proceso de estandarización comenzó en el taller de estándares para el paso de mensajes en un ambiente con memoria distribuida, patrocinado por el Centro de Investigación en Computación Paralela en Williamsburg, Virginia, Estados Unidos (abril 29-30 de 1992).

Se llegó a una propuesta preliminar conocida como MPI1, enfocada principalmente en comunicaciones punto a punto sin incluir rutinas para comunicación colectiva y no presentaba tareas seguras.

El estándar final por el MPI fue presentado en la conferencia de supercómputo en noviembre de 1993, constituyéndose así el foro para el MPI.

En un ambiente de comunicación con memoria distribuida en la cual las rutinas de paso de mensajes de nivel bajo, los beneficios de la estandarización son muy notorios. La principal ventaja al establecer un estándar para el paso de mensajes es la portabilidad y el ser fácil de utilizar. MPI-1 apareció en 1994, el estándar MPI-2 fue lanzado en 1997

Fundamentos de MPI

Con MPI el número de procesos requeridos se asigna antes de la ejecución del programa, y no se crean procesos adicionales mientras la aplicación se ejecuta. A cada proceso se le asigna una variable que se denomina rango, la cual identifica a cada proceso, en el rango de 0 a p-1, donde p es el número total de procesos. El control de la ejecución del programa se realiza mediante la variable de rango. Esta permite determinar qué proceso ejecuta determinada porción de código. En MPI se define un comunicador como una colección de procesos, los cuales pueden enviar mensajes el uno al otro; el comunicador básico se denomina MPI_COMM_WORLD y se define mediante un macro del lenguaje C. MPI_COMM_WORLD agrupa a todos los procesos activos durante la ejecución de una aplicación. Las llamadas de MPI se dividen en cuatro clases:

  1. Llamadas utilizadas para inicializar, administrar y finalizar comunicaciones.
  2. Llamadas utilizadas para transferir datos entre un par de procesos.
  3. Llamadas para transferir datos entre varios procesos.
  4. Llamadas utilizadas para crear tipos de datos definidos por el usuario.

La primera clase de llamadas permiten inicializar la biblioteca de paso de mensajes, identificar el número de procesos y el rango de los procesos. La segunda clase de llamadas incluye operaciones de comunicación punto a punto, para diferentes tipos de actividades de envío y recepción. La tercera clase de llamadas son conocidas como operaciones grupales, que proveen operaciones de comunicaciones entre grupos de procesos. La última clase de llamadas provee flexibilidad en la construcción de estructuras de datos complejos.

En MPI, un mensaje está conformado por el cuerpo del mensaje, el cual contiene los datos a ser enviados, y su envoltura, que indica el proceso fuente y el destino. El cuerpo del mensaje en MPI se conforma por tres piezas de información: búfer, tipo de dato y contador. El búfer, es la localidad de memoria donde se encuentran los datos de salida o donde se almacenan los datos de entrada. El tipo de dato, indica el tipo de los datos que se envían en el mensaje. En casos simples, éste es un tipo básico o primitivo, por ejemplo, un número entero, y que en aplicaciones más avanzadas puede ser un tipo de dato construido a través de datos primitivos. Los tipos de datos derivados son análogos a las estructuras de C. El contador es un número de secuencia que junto al tipo de datos permiten al usuario agrupar ítems de datos de un mismo tipo en un solo mensaje. MPI estandariza los tipos de datos primitivos, evitando que el programador se preocupe de las diferencias que existen entre ellos, cuando se encuentran en distintas plataformas.

La envoltura de un mensaje en MPI típicamente contiene la dirección destino, la dirección de la fuente, y cualquier otra información que se necesite para transmitir y entregar el mensaje. La envoltura de un mensaje en MPI, consta de cuatro partes: la fuente, el destino, el comunicador y una etiqueta. La fuente identifica al proceso transmisor. El destino identifica al proceso receptor. El comunicador especifica el grupo de procesos a los cuales pertenecen la fuente y el destino. La etiqueta permite clasificar el mensaje.

El campo etiqueta es un entero definido por el usuario que puede ser utilizado para distinguir los mensajes que recibe un proceso. Por ejemplo, se tienen dos procesos A y B. El proceso A envía dos mensajes al proceso B, ambos mensajes contienen un dato. Uno de los datos es utilizado para realizar un cálculo, mientras el otro es utilizado para imprimirlo en pantalla. El proceso A utiliza diferentes etiquetas para los mensajes. El proceso B utiliza los valores de etiquetas definidos en el proceso A e identifica que operación deberá realizar con el dato de cada mensaje.

Llamadas utilizadas para inicializar, administrar y finalizar comunicaciones

MPI dispone de cuatro funciones primordiales que se utilizan en todo programa con MPI: MPI_Init, MPI_Finalize, MPI_Comm_size y MPI_Comm_rank.

MPI_Init

Esta función inicializa todas las estructuras de datos necesarias para permitir la comunicación entre procesos basados en el envío de mensajes MPI y debe ser utilizada antes de llamar a cualquier otra función de MPI. Reserva el canal de comunicación, asigna un valor a la constante MPI_COMM_WORLD Esta rutina, o MPI_Init_thead, debe ser llamado antes que cualquier otra rutina de MPI. Debe ser llamada una única vez, en caso de no hacerlo así sería erróneo. De esta forma, un programa normal MPI debería quedar de la siguiente forma:

int main(int argc, char* argv[]){  /* Declaracion de variables */  MPI_Init(&argc, &argv);  /* Reparto de contenido */  /* Bucle principal del programa */  MPI_Finalize(); } 

Todos los programas MPI deben tener siempre una llamada a esta función. Los argumentos que recibe no son ni modificados, ni interpretados ni distribuidos.

Sintaxis de MPI_Init

En C

#include "mpi.h" int MPI_Init (int *argc, char ***argv) 

En C++

#include <mpi.h> void MPI::Init(int& argc, char**& argv) void MPI::Init() 

Parámetros de entrada de MPI_Init

argc: puntero al número de argumentos

argv: puntero al vector de argumentos

MPI_Finalize

Permite terminar una sesión MPI. Esta función debe ser la última llamada a MPI que un programa realice. Permite liberar la memoria usada por MPI.

MPI_Comm_size

Permite determinar el número total de procesos que pertenecen a un comunicador.

MPI_Comm_rank

Permite determinar el identificador o rango del proceso actual.

Llamadas utilizadas para transferir datos entre dos procesos

La transferencia de datos entre dos procesos se consigue mediante las llamadas MPI_Send y MPI_Recv. Estas llamadas devuelven un código que indica su éxito o fracaso.

MPI_Send

Permite enviar información desde un proceso a otro.

MPI_Recv

Permite recibir información desde otro proceso.

Ambas funciones son bloqueantes, es decir que el proceso que realiza la llamada se bloquea hasta que la operación de comunicación se complete.

Las versiones no bloqueantes de MPI_Send y MPI_Recv son MPI_Isend y MPI_Irecv, respectivamente. Estas llamadas inician la operación de transferencia pero su finalización debe ser realizada de forma explícita mediante llamadas como MPI_Test y MPI_Wait.

MPI_Wait

Es una llamada bloqueante y retorna cuando la operación de envío o recepción se completa.

MPI_Test

Permite verificar si la operación de envío o recepción ha finalizado, esta función primero chequea el estado de la operación de envío o recepción y luego retorna.

Llamadas utilizadas para transferir datos entre varios procesos

MPI posee llamadas para comunicaciones grupales que incluyen operaciones tipo difusión (broadcast), recolección (gather), distribución (scatter) y reducción. Algunas de las funciones que permiten realizar transferencia entre varios procesos se presentan a continuación.

MPI_Barrier permite realizar operaciones de sincronización. En estas operaciones no existe ninguna clase de intercambio de información. Suele emplearse para dar por finalizada una etapa del programa, asegurándose de que todos los procesos han terminado antes de dar comienzo a la siguiente.

MPI_Bcast permite a un proceso enviar una copia de sus datos a otros procesos dentro de un grupo definido por un comunicator.

MPI_Scatter establece una operación de distribución, en la cual un dato (arreglo de algún tipo de datos) se distribuye en diferentes procesos.

MPI_Gather establece una operación de recolección, en la cual los datos son recolectados en un solo proceso.

MPI_Reduce permite que el proceso raíz recolecte datos desde otros procesos en un grupo, y los combine en un solo ítem de datos. Por ejemplo, se podría utilizar una operación reducción, para calcular la suma de los elementos de un arreglo que se distribuyó en algunos procesos.

Llamadas utilizadas para crear tipos de datos definidos por el usuario

Para definir nuevos tipos de datos se puede utilizar la llamada MPI_Type_struct para crear un nuevo tipo o se puede utilizar la llamada MPI_Pack para empaquetar los datos.

Características de MPI

  • Estandarización.
  • Portabilidad: multiprocesadores, multicomputadores, redes, heterogéneos, ...
  • Buenas prestaciones.
  • Amplia funcionalidad.
  • Existencia de implementaciones libres (mpich, LAM-MPI, ...)

La especificación detalla las funciones que se pueden utilizar, no el modo como se compilan y lanzan-ejecutan los programas, lo cual puede variar de una implementación a otra.

Siguiendo el modelo SPMD, el usuario escribirá su aplicación como un proceso secuencial del que se lanzarán varias instancias que cooperan entre sí.

Los procesos invocan diferentes funciones MPI que permiten

  • iniciar, gestionar y finalizar procesos MPI
  • comunicar datos entre dos procesos
  • realizar operaciones de comunicación entre grupos de procesos
  • crear tipos arbitrarios de datos

Implementaciones

La implementación del lenguaje para MPI es, en general, los lenguajes que intentan optimizar el tiempo de ejecución.

La mayoría de las implementaciones de MPI se realizan en una combinación de C, C + + y el lenguaje ensamblador, C ++, Fortran. Sin embargo, el idioma y la aplicación de usuario final idioma son, en principio, siempre desasociado.

La etapa inicial de aplicación del estándar MPI 1.x fue MPICH, nacida en Argonne National Laboratory y la Universidad del Estado de Mississippi.

IBM también fue una de las primeras en implementar el estándar MPI, y la mayoría de las empresas de superordenador a principio de los años 90 comercializando MPICH o implementando su propia aplicación del estándar MPI 1.x.

LAM/MPI del Centro de Supercomputación de Ohio es otra de las primeras en implementarlo.

El Argonne National Laboratory continuó desarrollando MPICH durante más de una década, y ahora ofrece MPICH2 que se corresponde con la implementación del estándar MPI-2.1

LAM/MPI, y otra serie de esfuerzos recientes de MPI se han fusionado para formar un nuevo proyecto mundial, el llamado OpenMPI, pero este nombre no implica ninguna relación con el estándar.

Microsoft ha añadido una MPI al esfuerzo a sus Kit Cluster Computing (2005), basada en MPICH2. MPI se ha convertido y sigue siendo un elemento vital para la interfaz de programación concurrente a esta fecha de hoy.

Muchas distribuciones de Linux incluyen MPI (uno o ambos MPICH y LAM, como ejemplos particulares), pero es mejor obtener las últimas versiones de MPI de desarrolladores desde los sitios de desarrollo.

Muchos vendedores de distribuciones personalizadas de las actuales implementaciones de software libre, que se centran en un mejor rendimiento y estabilidad.

Además de la corriente principal de MPI para programación de alto rendimiento, MPI se ha utilizado ampliamente con Python, Perl, Java.

Estas comunidades están creciendo.

Basados en MATLAB MPI aparecen en muchas formas, pero no hay un consenso sobre una única manera de utilizar MPI con MATLAB.

Las siguientes secciones detallan algunos de estos esfuerzos.

Python

Hay por lo menos cinco intentos conocidos de aplicar MPI para Python: mpi4py, PyPar, PyMPI, MYMPI, y en el submódulo ScientificPython MPI.

PyMPI es notable porque se trata de una variante de python intérprete multi-nodo de la aplicación de la propia intérprete, más que el código se ejecuta el intérprete. Implementa la mayor parte de la especificación MPI y trabaja automáticamente con el código compilado que necesita para hacer llamadas MPI.

PyPar, MYMPI, y el módulo ScientificPython están diseñados para trabajar como un típico módulo realizando una declaración de importación.

Hacen el trabajo del codificador para decidir cuándo y dónde pertenece la llamada a MPI_Init.

OCaml

El Módulo OCamlMPI implementa un gran subconjunto de las funciones MPIy está en uso activo en la computación científica.

Para tener una idea de su madurez: se informó sobre la lista de Ocaml que una línea de once mil OCaml programa fue "MPI-ficados", utilizando el módulo, con un adicional de 500 líneas de código y ligera reestructuración y ha corrido con excelentes resultados hasta 170 nodos en un superordenador.

Java

Aunque Java no dispone de un funcionario MPI vinculantes, ha habido varios intentos de puente de Java y MPI, con diferentes grados de éxito y compatibilidad.

Uno de los primeros intentos fue Bryan Carpenter's mpiJava, básicamente una colección de envoltorios JNI de la biblioteca local MPI de C, cuyo resultado es un híbrido con limitada portabilidad en la práctica, y que tiene que ser recompilado con la biblioteca específica de la biblioteca MPI que se utiliza.

Sin embargo, este proyecto original definió el mpiJava API (de hecho una API MPI para Java equivalente a la de C ++ o muy similar), que posteriormente otros proyectos Java MPI han utilizado.

Una alternativa, aunque menos utilizada, es la API MPJ, diseñada para ser más orientada a objetos y más cerca a los convenios de codificación de Sun Microsystems.

Otros que utilizan la API de las bibliotecas Java MPI pueden ser dependientes de la biblioteca local, o llevar a cabo las funciones de paso de mensajes en Java, mientras que algunos como P2P-MPI también permiten la funcionalidad y operación de plataforma mixtos.

Algunas de las partes más difíciles de cualquier aplicación para Java MPI surgen de las limitaciones del propio lenguaje de programación y sus peculiaridades, como la falta de los punteros explícitos y espacio de las direcciones de memoria lineales para sus objetos, que hacen la transferencia de matrices o arrays multidimensionales y objetos complejos ineficientes.

Los métodos utilizados por lo general implican la transferencia de una línea a la vez o la realización explícita de serialización y emiten tanto en el envío y la recepción final, simulando C o FORTRAN como las matrices por el uso de un array unidimensional, y punteros a los tipos primitivos por el uso de un solo elemento de los vectores, lo que da lugar a estilos de programación bastante extraños de las convenciones Java.

Una de las principales mejoras es MPJ Express por Aamir Shafi y supervisado por Bryan Carpenter y Mark Baker. Como plataforma básica se usa Fast Ethernet, avances de la tecnología JVM ahora disponible programas Java escritos en Java a sus rivales C homólogos.

Por otra parte, las mejoras en el hardware especializados de red prosiguieron, disminuyendo los costes de comunicación a un par de microsegundos.

La cuestión clave en la actualidad no es para debatir entre sí es mejor la JNI con respecto al Java puro, sino el proporcionar un mecanismo flexible de los programas de intercambiar los protocolos de comunicación.

El objetivo de este proyecto es proporcionar un sistema de mensajería de referencia de Java basada en el estándar MPI. La aplicación sigue una arquitectura basada en una idea de los controladores de dispositivo.

.NET

Windows Compute Cluster Server utiliza el Microsoft Messaging Passing Interface v2 (MPI-MS) para la comunicación entre los nodos de procesamiento sobre el clúster de red.

La interfaz de programación de aplicaciones consta de más de 160 funciones. MS-MPI fue diseñado, con algunas excepciones, debido a consideraciones de seguridad, para abarcar el conjunto completo de funciones que MPI2 aplicado en MPICH2.

Hay también una completa gestionada aplicación .NET de MPI - Pure Mpi.NET. La API orientada a objetos es potente, fácil de utilizar para la programación paralela.

Ha sido desarrollado sobre la última tecnología .NET, incluido en la Windows Communication Foundation (WCF).

Esto le permite declarativamente especificar la configuración de llamada y configuración de entorno final y las necesidades de rendimiento.

Las interfaces MPI, a la vez que aprovecha al máximo las características de .NET -incluyendo los genéricos, los delegados, los resultados asíncronos, excepciones y extensibilidad.

Implementaciones hardware

No hubo investigación para implementar MPI directamente en el hardware del sistema, por ejemplo, por medio de procesador en la memoria, donde las operaciones MPI estén integrados en los chips de RAM de cada nodo.

Implícitamente, este tipo de aplicación sería independiente al lenguaje, Sistema Operativo o CPU en el sistema, pero no sería fácilmente actualizado.

Otra aproximación ha sido la de añadir aceleración hardware a una o más partes de la operación.

Esto puede incluir el hardware de procesamiento de las colas de MPI o el uso de RDMA directamente a la transferencia de datos entre la memoria y la interfaz de red sin necesidad de CPU o intervención del núcleo.

Funciones básicas

Cualquier programa paralelo con MPI puede implementarse con tan solo seis funciones, aunque hay muchas más funciones para aspectos avanzados. Todas ellas empiezan por MPI_ y obligan a que todos los programas escritos en MPI contengan la directiva:

 #include "mpi.h", 

Este fichero contiene las definiciones, macros y prototipos de función necesarios para compilar los programas MPI.

Antes de llamar a cualquier otra función MPI debe hacer una llamada a MPI_Init(); esta función sólo debe ser llamada una vez. Sus argumentos son punteros a los parámetros de la función main(), argc y argv. Esta función permite al sistema hacer todas la configuraciones necesarias para que la biblioteca MPI pueda ser usada. Después de que el programa haya acabado de utilizar la biblioteca MPI se debe hacer una llamada a MPI_Finalize(). La función MPI_Finalize() limpia todos los trabajos no finalizados dejados por MPI. Los programas MPI deben ser obligatoriamente inicializados y finalizados en MPI (MPI_Init, MPI_Finalize).

MPI ofrece la función MPI_Comm_rank(), la cual retorna el identificador de un proceso en su segundo argumento. Su sintaxis es:

int MPI_Comm_rank(MPI_Comm comunicador, int* identificador) 

El primer argumento es el comunicador. Esencialmente un comunicador es una colección de procesos que pueden enviarse mensajes entre sí. Normalmente para diseñar programas básicos el único comunicador que se necesitará es MPI_COMM_WORLD. Está predefinido en MPI y consiste en todos los procesos que se ejecutan cuando el programa comienza.

Muchas de las construcciones que se emplean en los programas, dependen también del número de procesos que se ejecutan. MPI ofrece la función MPI_Comm_size() para determinar dicho número de procesos. Su primer argumento es el comunicador. En el segundo argumento retorna el número de procesos pertenecientes a dicho comunicador. Su sintaxis es:

int MPI_Comm_size(MPI_Comm comunicador, int* numprocs) 

La función MPI_Get_processor_name() permite conocer el nombre del procesador donde está ubicado cada proceso. Esto puede ser útil para monitorizar los programas en redes heterogéneas. Conocer en qué máquina concreta se está ejecutando un proceso específico puede ser determinante para explicar su comportamiento, para lo cual puede apoyarse con las herramientas de monitorización . La sintaxis de dicha función es la siguiente:

int MPI_Get_processor_name(char* nombre, int* longnombre) 

El parámetro nombre es una cadena (vector de caracteres) cuyo tamaño debe ser al menos igual a la constante MPI_MAX_PROCESSOR_NAME. En dicho vector quedará almacenado el nombre del procesador. El parámetro longnombre es otro parámetro de salida que informa de la longitud de la cadena obtenida.

El paso de mensajes bloqueantes se lleva a cabo en los programas por las funciones MPI_Send() y MPI_Recv() principalmente. La primera función envía un mensaje a un proceso determinado. La segunda recibe un mensaje de un proceso. Estas son las funciones más básicas de paso de mensajes en MPI.

En MPI el entorno contiene la siguiente información:

  1. El identificador del proceso receptor del mensaje.
  2. El identificador del proceso emisor del mensaje.
  3. Una etiqueta.
  4. Un comunicador.

Fichero cabecera:

  1. include <mpi.h>

Formato de las funciones: codigo_error = MPI_nombre( parámetros ... )

Inicialización: int MPI_Init ( int *argc , char ***argv )

Comunicador: Conjunto de procesos que se intercomunican. Por defecto podemos utilizar MPI_COMM_WORLD , en cuyo caso el grupo de procesos es el conjunto de procesos lanzados conjuntamente para resolver un problema

Identificación de procesos: MPI_Comm_rank ( MPI_Comm comm , int *rank)

Procesos en el comunicador: MPI_Comm_size ( MPI_Comm comm , int *size)

Finalización: int MPI_Finalize ( )

Mensajes: Un mensaje estará formado por un cierto número de elementos de un mismo tipo MPI.

Tipos MPI básicos:

MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHOT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_BYTE
MPI_PACKED

Tipos MPI derivados: los construye el programador.

Envío de un mensaje a otro proceso: int MPI_Send ( void *posicion_de_memoria , int contador , MPI_Datatype tipo , int destino , int etiqueta , MPI_Comm comunicador )

Recepción de un mensaje de otro proceso:

int MPI_Recv ( void *posicion_de_memoria , int contador , MPI_Datatype tipo , int origen , int etiqueta, MPI_Comm comunicador , MPI_Status *estado)

El receptor puede emplear MPI_ANY_TAG y/o MPI_ANY_SOURCE

Ejemplo

A continuación se presenta un “Hola Mundo” implementado en C utilizando MPI. El programa envía un mensaje a cada nodo y lo imprime en pantalla. Además, cada nodo procesa el mensaje y retorna los resultados al nodo principal.

#include <mpi.h> #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) {  char idstr[32];  char buff[128];  int numprocs;  int myid;  int i;  MPI_Status stat;   MPI_Init(&argc,&argv);   MPI_Comm_size(MPI_COMM_WORLD,&numprocs);   MPI_Comm_rank(MPI_COMM_WORLD,&myid);   if(myid == 0)  {  printf("Tenemos %d procesos\n", numprocs);  for(i=1;i<numprocs;i++)  {  sprintf(buff, "¡Holaaa %d! ", i);  MPI_Send(buff, 128, MPI_CHAR, i, 0, MPI_COMM_WORLD);  }  for(i=1;i<numprocs;i++)  {  MPI_Recv(buff, 128, MPI_CHAR, i, 0, MPI_COMM_WORLD, &stat);  printf("%s\n", buff);  }  }  else  {  MPI_Recv(buff, 128, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &stat);  sprintf(idstr, "Proceso %d ", myid);  strcat(buff, idstr);  strcat(buff, "reportandose\n");  MPI_Send(buff, 128, MPI_CHAR, 0, 0, MPI_COMM_WORLD);  }  MPI_Finalize();  return 0; } 

Ejemplo 2

/*  * Open Systems Laboratory  * http://www.lam-mpi.org/tutorials/  * Indiana University  *  * MPI Tutorial  * Lab 2: The cannonical ring program  *  * Mail questions regarding tutorial material to lam at lam dash mpi dot org  */ #include <stdio.h> #include <mpi.h> int  main(int argc, char *argv[]){  MPI_Status status;  int num, rank, size, tag, next, from;  /* Start up MPI */  MPI_Init(&argc, &argv);  MPI_Comm_rank(MPI_COMM_WORLD, &rank);  MPI_Comm_size(MPI_COMM_WORLD, &size);    /* Arbitrarily choose 201 to be our tag. Calculate the rank of the  next process in the ring. Use the modulus operator so that the  last process "wraps around" to rank zero. */  tag = 201;  next = (rank + 1) % size;  from = (rank + size - 1) % size;  /* If we are the "console" process, get a integer from the user to  specify how many times we want to go around the ring */  if (rank == 0) {  printf("Enter the number of times around the ring: ");  scanf("%d", &num);  printf("Process %d sending %d to %d\n", rank, num, next);  MPI_Send(&num, 1, MPI_INT, next, tag, MPI_COMM_WORLD);   }  /* Pass the message around the ring. The exit mechanism works as  follows: the message (a positive integer) is passed around the  ring. Each time is passes rank 0, it is decremented. When each  processes receives the 0 message, it passes it on to the next  process and then quits. By passing the 0 first, every process  gets the 0 message and can quit normally. */  do {  MPI_Recv(&num, 1, MPI_INT, from, tag, MPI_COMM_WORLD, &status);  printf("Process %d received %d\n", rank, num);  if (rank == 0) {  --num;  printf("Process 0 decremented num\n");  }  printf("Process %d sending %d to %d\n", rank, num, next);  MPI_Send(&num, 1, MPI_INT, next, tag, MPI_COMM_WORLD);  } while (num > 0);  printf("Process %d exiting\n", rank);  /* The last process does one extra send to process 0, which needs to  be received before the program can exit */  if (rank == 0)  MPI_Recv(&num, 1, MPI_INT, from, tag, MPI_COMM_WORLD, &status);  /* Quit */  MPI_Finalize();  return 0; } 

Véase también

Enlaces externos

  • Programación de aplicaciones paralelas  con MPI (Message Passing Interface)
  • MPI specification
  • MPI DMOZ category
  • Open MPI web site
  • LAM/MPI web site
  • SCore MPI
  • HP-MPI
  • MVAPICH: MPI over InfiniBand
  • PVM/MPI Users' Group Meeting (2006 edition)
  • Message Passing Interface Forum
  • Ayuda MPI - Cátedra Programación Paralela - Universidad de Granada
  •   Datos: Q127879

interfaz, paso, mensajes, para, multidimensional, poverty, index, véase, Índice, pobreza, multidimensional, interfaz, paso, mensajes, sigla, inglés, message, passing, interface, estándar, define, sintaxis, semántica, funciones, contenidas, biblioteca, paso, me. Para MPI Multidimensional Poverty Index vease Indice de pobreza multidimensional La interfaz de paso de mensajes o MPI sigla del ingles message passing interface es un estandar que define la sintaxis y la semantica de las funciones contenidas en una biblioteca de paso de mensajes disenada para ser usada en programas que exploten la existencia de multiples procesadores escritos generalmente C C Fortran y Ada La ventaja de MPI sobre otras bibliotecas de paso de mensajes es que los programas que utilizan la biblioteca son portables dado que MPI ha sido implementado para casi toda arquitectura de memoria distribuida y rapidos porque cada implementacion de la biblioteca ha sido optimizada para el hardware en la cual se ejecuta Indice 1 Historia 2 Fundamentos de MPI 2 1 Llamadas utilizadas para inicializar administrar y finalizar comunicaciones 2 2 Llamadas utilizadas para transferir datos entre dos procesos 2 3 Llamadas utilizadas para transferir datos entre varios procesos 2 4 Llamadas utilizadas para crear tipos de datos definidos por el usuario 3 Caracteristicas de MPI 4 Implementaciones 4 1 Python 4 2 OCaml 4 3 Java 4 4 NET 4 5 Implementaciones hardware 5 Funciones basicas 6 Ejemplo 7 Vease tambien 8 Enlaces externosHistoria EditarAl disenarse la interfaz de paso de mensajes se tuvieron en cuenta las caracteristicas mas atractivas de los sistemas existentes para el paso de mensajes en vez de seleccionar uno solo de ellos y adoptarlo como el estandar resultando asi en una fuerte influencia para MPI los trabajos hechos por IBM INTEL NX Express nCUBE s Vernex p4 y PARMACS Otras contribuciones importantes provienen de Zipcode Chimp PVM Chameleon y PICL El esfuerzo para estandarizar MPI involucro a cerca de 60 personas de 40 organizaciones diferentes principalmente de EE UU y Europa La mayoria de los vendedores de computadoras concurrentes estaban involucrados con MPI asi como con investigadores de diferentes universidades laboratorios del gobierno e industrias El proceso de estandarizacion comenzo en el taller de estandares para el paso de mensajes en un ambiente con memoria distribuida patrocinado por el Centro de Investigacion en Computacion Paralela en Williamsburg Virginia Estados Unidos abril 29 30 de 1992 Se llego a una propuesta preliminar conocida como MPI1 enfocada principalmente en comunicaciones punto a punto sin incluir rutinas para comunicacion colectiva y no presentaba tareas seguras El estandar final por el MPI fue presentado en la conferencia de supercomputo en noviembre de 1993 constituyendose asi el foro para el MPI En un ambiente de comunicacion con memoria distribuida en la cual las rutinas de paso de mensajes de nivel bajo los beneficios de la estandarizacion son muy notorios La principal ventaja al establecer un estandar para el paso de mensajes es la portabilidad y el ser facil de utilizar MPI 1 aparecio en 1994 el estandar MPI 2 fue lanzado en 1997Fundamentos de MPI EditarCon MPI el numero de procesos requeridos se asigna antes de la ejecucion del programa y no se crean procesos adicionales mientras la aplicacion se ejecuta A cada proceso se le asigna una variable que se denomina rango la cual identifica a cada proceso en el rango de 0 a p 1 donde p es el numero total de procesos El control de la ejecucion del programa se realiza mediante la variable de rango Esta permite determinar que proceso ejecuta determinada porcion de codigo En MPI se define un comunicador como una coleccion de procesos los cuales pueden enviar mensajes el uno al otro el comunicador basico se denomina MPI COMM WORLD y se define mediante un macro del lenguaje C MPI COMM WORLD agrupa a todos los procesos activos durante la ejecucion de una aplicacion Las llamadas de MPI se dividen en cuatro clases Llamadas utilizadas para inicializar administrar y finalizar comunicaciones Llamadas utilizadas para transferir datos entre un par de procesos Llamadas para transferir datos entre varios procesos Llamadas utilizadas para crear tipos de datos definidos por el usuario La primera clase de llamadas permiten inicializar la biblioteca de paso de mensajes identificar el numero de procesos y el rango de los procesos La segunda clase de llamadas incluye operaciones de comunicacion punto a punto para diferentes tipos de actividades de envio y recepcion La tercera clase de llamadas son conocidas como operaciones grupales que proveen operaciones de comunicaciones entre grupos de procesos La ultima clase de llamadas provee flexibilidad en la construccion de estructuras de datos complejos En MPI un mensaje esta conformado por el cuerpo del mensaje el cual contiene los datos a ser enviados y su envoltura que indica el proceso fuente y el destino El cuerpo del mensaje en MPI se conforma por tres piezas de informacion bufer tipo de dato y contador El bufer es la localidad de memoria donde se encuentran los datos de salida o donde se almacenan los datos de entrada El tipo de dato indica el tipo de los datos que se envian en el mensaje En casos simples este es un tipo basico o primitivo por ejemplo un numero entero y que en aplicaciones mas avanzadas puede ser un tipo de dato construido a traves de datos primitivos Los tipos de datos derivados son analogos a las estructuras de C El contador es un numero de secuencia que junto al tipo de datos permiten al usuario agrupar items de datos de un mismo tipo en un solo mensaje MPI estandariza los tipos de datos primitivos evitando que el programador se preocupe de las diferencias que existen entre ellos cuando se encuentran en distintas plataformas La envoltura de un mensaje en MPI tipicamente contiene la direccion destino la direccion de la fuente y cualquier otra informacion que se necesite para transmitir y entregar el mensaje La envoltura de un mensaje en MPI consta de cuatro partes la fuente el destino el comunicador y una etiqueta La fuente identifica al proceso transmisor El destino identifica al proceso receptor El comunicador especifica el grupo de procesos a los cuales pertenecen la fuente y el destino La etiqueta permite clasificar el mensaje El campo etiqueta es un entero definido por el usuario que puede ser utilizado para distinguir los mensajes que recibe un proceso Por ejemplo se tienen dos procesos A y B El proceso A envia dos mensajes al proceso B ambos mensajes contienen un dato Uno de los datos es utilizado para realizar un calculo mientras el otro es utilizado para imprimirlo en pantalla El proceso A utiliza diferentes etiquetas para los mensajes El proceso B utiliza los valores de etiquetas definidos en el proceso A e identifica que operacion debera realizar con el dato de cada mensaje Llamadas utilizadas para inicializar administrar y finalizar comunicaciones Editar MPI dispone de cuatro funciones primordiales que se utilizan en todo programa con MPI MPI Init MPI Finalize MPI Comm size y MPI Comm rank MPI InitEsta funcion inicializa todas las estructuras de datos necesarias para permitir la comunicacion entre procesos basados en el envio de mensajes MPI y debe ser utilizada antes de llamar a cualquier otra funcion de MPI Reserva el canal de comunicacion asigna un valor a la constante MPI COMM WORLD Esta rutina o MPI Init thead debe ser llamado antes que cualquier otra rutina de MPI Debe ser llamada una unica vez en caso de no hacerlo asi seria erroneo De esta forma un programa normal MPI deberia quedar de la siguiente forma int main int argc char argv Declaracion de variables MPI Init amp argc amp argv Reparto de contenido Bucle principal del programa MPI Finalize Todos los programas MPI deben tener siempre una llamada a esta funcion Los argumentos que recibe no son ni modificados ni interpretados ni distribuidos Sintaxis de MPI Init En C include mpi h int MPI Init int argc char argv En C include lt mpi h gt void MPI Init int amp argc char amp argv void MPI Init Parametros de entrada de MPI Initargc puntero al numero de argumentosargv puntero al vector de argumentosMPI FinalizePermite terminar una sesion MPI Esta funcion debe ser la ultima llamada a MPI que un programa realice Permite liberar la memoria usada por MPI MPI Comm sizePermite determinar el numero total de procesos que pertenecen a un comunicador MPI Comm rankPermite determinar el identificador o rango del proceso actual Llamadas utilizadas para transferir datos entre dos procesos Editar La transferencia de datos entre dos procesos se consigue mediante las llamadas MPI Send y MPI Recv Estas llamadas devuelven un codigo que indica su exito o fracaso MPI SendPermite enviar informacion desde un proceso a otro MPI RecvPermite recibir informacion desde otro proceso Ambas funciones son bloqueantes es decir que el proceso que realiza la llamada se bloquea hasta que la operacion de comunicacion se complete Las versiones no bloqueantes de MPI Send y MPI Recv son MPI Isend y MPI Irecv respectivamente Estas llamadas inician la operacion de transferencia pero su finalizacion debe ser realizada de forma explicita mediante llamadas como MPI Test y MPI Wait MPI WaitEs una llamada bloqueante y retorna cuando la operacion de envio o recepcion se completa MPI TestPermite verificar si la operacion de envio o recepcion ha finalizado esta funcion primero chequea el estado de la operacion de envio o recepcion y luego retorna Llamadas utilizadas para transferir datos entre varios procesos Editar MPI posee llamadas para comunicaciones grupales que incluyen operaciones tipo difusion broadcast recoleccion gather distribucion scatter y reduccion Algunas de las funciones que permiten realizar transferencia entre varios procesos se presentan a continuacion MPI Barrier permite realizar operaciones de sincronizacion En estas operaciones no existe ninguna clase de intercambio de informacion Suele emplearse para dar por finalizada una etapa del programa asegurandose de que todos los procesos han terminado antes de dar comienzo a la siguiente MPI Bcast permite a un proceso enviar una copia de sus datos a otros procesos dentro de un grupo definido por un comunicator MPI Scatter establece una operacion de distribucion en la cual un dato arreglo de algun tipo de datos se distribuye en diferentes procesos MPI Gather establece una operacion de recoleccion en la cual los datos son recolectados en un solo proceso MPI Reduce permite que el proceso raiz recolecte datos desde otros procesos en un grupo y los combine en un solo item de datos Por ejemplo se podria utilizar una operacion reduccion para calcular la suma de los elementos de un arreglo que se distribuyo en algunos procesos Llamadas utilizadas para crear tipos de datos definidos por el usuario Editar Para definir nuevos tipos de datos se puede utilizar la llamada MPI Type struct para crear un nuevo tipo o se puede utilizar la llamada MPI Pack para empaquetar los datos Caracteristicas de MPI EditarEstandarizacion Portabilidad multiprocesadores multicomputadores redes heterogeneos Buenas prestaciones Amplia funcionalidad Existencia de implementaciones libres mpich LAM MPI La especificacion detalla las funciones que se pueden utilizar no el modo como se compilan y lanzan ejecutan los programas lo cual puede variar de una implementacion a otra Siguiendo el modelo SPMD el usuario escribira su aplicacion como un proceso secuencial del que se lanzaran varias instancias que cooperan entre si Los procesos invocan diferentes funciones MPI que permiten iniciar gestionar y finalizar procesos MPI comunicar datos entre dos procesos realizar operaciones de comunicacion entre grupos de procesos crear tipos arbitrarios de datosImplementaciones EditarLa implementacion del lenguaje para MPI es en general los lenguajes que intentan optimizar el tiempo de ejecucion La mayoria de las implementaciones de MPI se realizan en una combinacion de C C y el lenguaje ensamblador C Fortran Sin embargo el idioma y la aplicacion de usuario final idioma son en principio siempre desasociado La etapa inicial de aplicacion del estandar MPI 1 x fue MPICH nacida en Argonne National Laboratory y la Universidad del Estado de Mississippi IBM tambien fue una de las primeras en implementar el estandar MPI y la mayoria de las empresas de superordenador a principio de los anos 90 comercializando MPICH o implementando su propia aplicacion del estandar MPI 1 x LAM MPI del Centro de Supercomputacion de Ohio es otra de las primeras en implementarlo El Argonne National Laboratory continuo desarrollando MPICH durante mas de una decada y ahora ofrece MPICH2 que se corresponde con la implementacion del estandar MPI 2 1LAM MPI y otra serie de esfuerzos recientes de MPI se han fusionado para formar un nuevo proyecto mundial el llamado OpenMPI pero este nombre no implica ninguna relacion con el estandar Microsoft ha anadido una MPI al esfuerzo a sus Kit Cluster Computing 2005 basada en MPICH2 MPI se ha convertido y sigue siendo un elemento vital para la interfaz de programacion concurrente a esta fecha de hoy Muchas distribuciones de Linux incluyen MPI uno o ambos MPICH y LAM como ejemplos particulares pero es mejor obtener las ultimas versiones de MPI de desarrolladores desde los sitios de desarrollo Muchos vendedores de distribuciones personalizadas de las actuales implementaciones de software libre que se centran en un mejor rendimiento y estabilidad Ademas de la corriente principal de MPI para programacion de alto rendimiento MPI se ha utilizado ampliamente con Python Perl Java Estas comunidades estan creciendo Basados en MATLAB MPI aparecen en muchas formas pero no hay un consenso sobre una unica manera de utilizar MPI con MATLAB Las siguientes secciones detallan algunos de estos esfuerzos Python Editar Hay por lo menos cinco intentos conocidos de aplicar MPI para Python mpi4py PyPar PyMPI MYMPI y en el submodulo ScientificPython MPI PyMPI es notable porque se trata de una variante de python interprete multi nodo de la aplicacion de la propia interprete mas que el codigo se ejecuta el interprete Implementa la mayor parte de la especificacion MPI y trabaja automaticamente con el codigo compilado que necesita para hacer llamadas MPI PyPar MYMPI y el modulo ScientificPython estan disenados para trabajar como un tipico modulo realizando una declaracion de importacion Hacen el trabajo del codificador para decidir cuando y donde pertenece la llamada a MPI Init OCaml Editar El Modulo OCamlMPI implementa un gran subconjunto de las funciones MPIy esta en uso activo en la computacion cientifica Para tener una idea de su madurez se informo sobre la lista de Ocaml que una linea de once mil OCaml programa fue MPI ficados utilizando el modulo con un adicional de 500 lineas de codigo y ligera reestructuracion y ha corrido con excelentes resultados hasta 170 nodos en un superordenador Java Editar Aunque Java no dispone de un funcionario MPI vinculantes ha habido varios intentos de puente de Java y MPI con diferentes grados de exito y compatibilidad Uno de los primeros intentos fue Bryan Carpenter s mpiJava basicamente una coleccion de envoltorios JNI de la biblioteca local MPI de C cuyo resultado es un hibrido con limitada portabilidad en la practica y que tiene que ser recompilado con la biblioteca especifica de la biblioteca MPI que se utiliza Sin embargo este proyecto original definio el mpiJava API de hecho una API MPI para Java equivalente a la de C o muy similar que posteriormente otros proyectos Java MPI han utilizado Una alternativa aunque menos utilizada es la API MPJ disenada para ser mas orientada a objetos y mas cerca a los convenios de codificacion de Sun Microsystems Otros que utilizan la API de las bibliotecas Java MPI pueden ser dependientes de la biblioteca local o llevar a cabo las funciones de paso de mensajes en Java mientras que algunos como P2P MPI tambien permiten la funcionalidad y operacion de plataforma mixtos Algunas de las partes mas dificiles de cualquier aplicacion para Java MPI surgen de las limitaciones del propio lenguaje de programacion y sus peculiaridades como la falta de los punteros explicitos y espacio de las direcciones de memoria lineales para sus objetos que hacen la transferencia de matrices o arrays multidimensionales y objetos complejos ineficientes Los metodos utilizados por lo general implican la transferencia de una linea a la vez o la realizacion explicita de serializacion y emiten tanto en el envio y la recepcion final simulando C o FORTRAN como las matrices por el uso de un array unidimensional y punteros a los tipos primitivos por el uso de un solo elemento de los vectores lo que da lugar a estilos de programacion bastante extranos de las convenciones Java Una de las principales mejoras es MPJ Express por Aamir Shafi y supervisado por Bryan Carpenter y Mark Baker Como plataforma basica se usa Fast Ethernet avances de la tecnologia JVM ahora disponible programas Java escritos en Java a sus rivales C homologos Por otra parte las mejoras en el hardware especializados de red prosiguieron disminuyendo los costes de comunicacion a un par de microsegundos La cuestion clave en la actualidad no es para debatir entre si es mejor la JNI con respecto al Java puro sino el proporcionar un mecanismo flexible de los programas de intercambiar los protocolos de comunicacion El objetivo de este proyecto es proporcionar un sistema de mensajeria de referencia de Java basada en el estandar MPI La aplicacion sigue una arquitectura basada en una idea de los controladores de dispositivo NET Editar Windows Compute Cluster Server utiliza el Microsoft Messaging Passing Interface v2 MPI MS para la comunicacion entre los nodos de procesamiento sobre el cluster de red La interfaz de programacion de aplicaciones consta de mas de 160 funciones MS MPI fue disenado con algunas excepciones debido a consideraciones de seguridad para abarcar el conjunto completo de funciones que MPI2 aplicado en MPICH2 Hay tambien una completa gestionada aplicacion NET de MPI Pure Mpi NET La API orientada a objetos es potente facil de utilizar para la programacion paralela Ha sido desarrollado sobre la ultima tecnologia NET incluido en la Windows Communication Foundation WCF Esto le permite declarativamente especificar la configuracion de llamada y configuracion de entorno final y las necesidades de rendimiento Las interfaces MPI a la vez que aprovecha al maximo las caracteristicas de NET incluyendo los genericos los delegados los resultados asincronos excepciones y extensibilidad Implementaciones hardware Editar No hubo investigacion para implementar MPI directamente en el hardware del sistema por ejemplo por medio de procesador en la memoria donde las operaciones MPI esten integrados en los chips de RAM de cada nodo Implicitamente este tipo de aplicacion seria independiente al lenguaje Sistema Operativo o CPU en el sistema pero no seria facilmente actualizado Otra aproximacion ha sido la de anadir aceleracion hardware a una o mas partes de la operacion Esto puede incluir el hardware de procesamiento de las colas de MPI o el uso de RDMA directamente a la transferencia de datos entre la memoria y la interfaz de red sin necesidad de CPU o intervencion del nucleo Funciones basicas EditarCualquier programa paralelo con MPI puede implementarse con tan solo seis funciones aunque hay muchas mas funciones para aspectos avanzados Todas ellas empiezan por MPI y obligan a que todos los programas escritos en MPI contengan la directiva include mpi h Este fichero contiene las definiciones macros y prototipos de funcion necesarios para compilar los programas MPI Antes de llamar a cualquier otra funcion MPI debe hacer una llamada a MPI Init esta funcion solo debe ser llamada una vez Sus argumentos son punteros a los parametros de la funcion main argc y argv Esta funcion permite al sistema hacer todas la configuraciones necesarias para que la biblioteca MPI pueda ser usada Despues de que el programa haya acabado de utilizar la biblioteca MPI se debe hacer una llamada a MPI Finalize La funcion MPI Finalize limpia todos los trabajos no finalizados dejados por MPI Los programas MPI deben ser obligatoriamente inicializados y finalizados en MPI MPI Init MPI Finalize MPI ofrece la funcion MPI Comm rank la cual retorna el identificador de un proceso en su segundo argumento Su sintaxis es int MPI Comm rank MPI Comm comunicador int identificador El primer argumento es el comunicador Esencialmente un comunicador es una coleccion de procesos que pueden enviarse mensajes entre si Normalmente para disenar programas basicos el unico comunicador que se necesitara es MPI COMM WORLD Esta predefinido en MPI y consiste en todos los procesos que se ejecutan cuando el programa comienza Muchas de las construcciones que se emplean en los programas dependen tambien del numero de procesos que se ejecutan MPI ofrece la funcion MPI Comm size para determinar dicho numero de procesos Su primer argumento es el comunicador En el segundo argumento retorna el numero de procesos pertenecientes a dicho comunicador Su sintaxis es int MPI Comm size MPI Comm comunicador int numprocs La funcion MPI Get processor name permite conocer el nombre del procesador donde esta ubicado cada proceso Esto puede ser util para monitorizar los programas en redes heterogeneas Conocer en que maquina concreta se esta ejecutando un proceso especifico puede ser determinante para explicar su comportamiento para lo cual puede apoyarse con las herramientas de monitorizacion La sintaxis de dicha funcion es la siguiente int MPI Get processor name char nombre int longnombre El parametro nombre es una cadena vector de caracteres cuyo tamano debe ser al menos igual a la constante MPI MAX PROCESSOR NAME En dicho vector quedara almacenado el nombre del procesador El parametro longnombre es otro parametro de salida que informa de la longitud de la cadena obtenida El paso de mensajes bloqueantes se lleva a cabo en los programas por las funciones MPI Send y MPI Recv principalmente La primera funcion envia un mensaje a un proceso determinado La segunda recibe un mensaje de un proceso Estas son las funciones mas basicas de paso de mensajes en MPI En MPI el entorno contiene la siguiente informacion El identificador del proceso receptor del mensaje El identificador del proceso emisor del mensaje Una etiqueta Un comunicador Fichero cabecera include lt mpi h gt Formato de las funciones codigo error MPI nombre parametros Inicializacion int MPI Init int argc char argv Comunicador Conjunto de procesos que se intercomunican Por defecto podemos utilizar MPI COMM WORLD en cuyo caso el grupo de procesos es el conjunto de procesos lanzados conjuntamente para resolver un problemaIdentificacion de procesos MPI Comm rank MPI Comm comm int rank Procesos en el comunicador MPI Comm size MPI Comm comm int size Finalizacion int MPI Finalize Mensajes Un mensaje estara formado por un cierto numero de elementos de un mismo tipo MPI Tipos MPI basicos MPI CHAR signed charMPI SHORT signed short intMPI INT signed intMPI LONG signed long intMPI UNSIGNED CHAR unsigned charMPI UNSIGNED SHOT unsigned short intMPI UNSIGNED unsigned intMPI UNSIGNED LONG unsigned long intMPI FLOAT floatMPI DOUBLE doubleMPI LONG DOUBLE long doubleMPI BYTEMPI PACKEDTipos MPI derivados los construye el programador Envio de un mensaje a otro proceso int MPI Send void posicion de memoria int contador MPI Datatype tipo int destino int etiqueta MPI Comm comunicador Recepcion de un mensaje de otro proceso int MPI Recv void posicion de memoria int contador MPI Datatype tipo int origen int etiqueta MPI Comm comunicador MPI Status estado El receptor puede emplear MPI ANY TAG y o MPI ANY SOURCEEjemplo EditarA continuacion se presenta un Hola Mundo implementado en C utilizando MPI El programa envia un mensaje a cada nodo y lo imprime en pantalla Ademas cada nodo procesa el mensaje y retorna los resultados al nodo principal include lt mpi h gt include lt stdio h gt include lt string h gt int main int argc char argv char idstr 32 char buff 128 int numprocs int myid int i MPI Status stat MPI Init amp argc amp argv MPI Comm size MPI COMM WORLD amp numprocs MPI Comm rank MPI COMM WORLD amp myid if myid 0 printf Tenemos d procesos n numprocs for i 1 i lt numprocs i sprintf buff Holaaa d i MPI Send buff 128 MPI CHAR i 0 MPI COMM WORLD for i 1 i lt numprocs i MPI Recv buff 128 MPI CHAR i 0 MPI COMM WORLD amp stat printf s n buff else MPI Recv buff 128 MPI CHAR 0 0 MPI COMM WORLD amp stat sprintf idstr Proceso d myid strcat buff idstr strcat buff reportandose n MPI Send buff 128 MPI CHAR 0 0 MPI COMM WORLD MPI Finalize return 0 Ejemplo 2 Open Systems Laboratory http www lam mpi org tutorials Indiana University MPI Tutorial Lab 2 The cannonical ring program Mail questions regarding tutorial material to lam at lam dash mpi dot org include lt stdio h gt include lt mpi h gt int main int argc char argv MPI Status status int num rank size tag next from Start up MPI MPI Init amp argc amp argv MPI Comm rank MPI COMM WORLD amp rank MPI Comm size MPI COMM WORLD amp size Arbitrarily choose 201 to be our tag Calculate the rank of the next process in the ring Use the modulus operator so that the last process wraps around to rank zero tag 201 next rank 1 size from rank size 1 size If we are the console process get a integer from the user to specify how many times we want to go around the ring if rank 0 printf Enter the number of times around the ring scanf d amp num printf Process d sending d to d n rank num next MPI Send amp num 1 MPI INT next tag MPI COMM WORLD Pass the message around the ring The exit mechanism works as follows the message a positive integer is passed around the ring Each time is passes rank 0 it is decremented When each processes receives the 0 message it passes it on to the next process and then quits By passing the 0 first every process gets the 0 message and can quit normally do MPI Recv amp num 1 MPI INT from tag MPI COMM WORLD amp status printf Process d received d n rank num if rank 0 num printf Process 0 decremented num n printf Process d sending d to d n rank num next MPI Send amp num 1 MPI INT next tag MPI COMM WORLD while num gt 0 printf Process d exiting n rank The last process does one extra send to process 0 which needs to be received before the program can exit if rank 0 MPI Recv amp num 1 MPI INT from tag MPI COMM WORLD amp status Quit MPI Finalize return 0 Vease tambien EditarPVMEnlaces externos EditarProgramacion de aplicaciones paralelas con MPI Message Passing Interface MPI specification MPI DMOZ category Open MPI web site LAM MPI web site MPICH SCore MPI Scali MPI HP MPI MVAPICH MPI over InfiniBand Parawiki page for MPI Global Arrays PVM MPI Users Group Meeting 2006 edition MPI Samples Manage MPI jobs with Moab MPICH over Myrinet GM classic driver MPICH over Myrinet MX next gen driver Parallel Programming with MatlabMPI SGI Message Passing Toolkit Message Passing Interface Forum Ayuda MPI Catedra Programacion Paralela Universidad de Granada Datos Q127879 Obtenido de https es wikipedia org w index php title Interfaz de Paso de Mensajes amp oldid 137512103, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos