Está en la página 1de 34

Procesos

Elementos de Programación Multiproceso


Entornos de Programación Multiproceso

Proyecto Universidad-Secundaria
Incorporación de contenidos de programación paralela en
la rama de tecnologı́as informáticas

Facultad Informática, Universidad de Murcia e


Instituto de Enseñanza Secundaria Ingeniero Juan de la Cierva

Programación Multiproceso

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Posible utilización

Módulo de Programación de servicios y procesos, segundo


de Desarrollo de Aplicaciones Multiplataforma
Parcialmente se podrı́a usar en Tecnologı́as de la Información
y de las Comunicaciones, primero de Bachillerato

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Contenido

1 Procesos

2 Elementos de Programación Multiproceso

3 Entornos de Programación Multiproceso


Uso de pipe en C/C++
Captura de flujo de I/O en Java
MPI

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Concepto de proceso

Un proceso es una instancia de un programa que se ejecuta:


Programa: Colección de instrucciones.
Proceso: Ejecución de las instrucciones.
se pueden ejecutar varias instancias (procesos) del mismo
programa,
varios procesos (del mismo o distinto programa) pueden
colaborar en la resolución de un problema, compartiendo los
recursos del sistema computacional,
se necesitan mecanismos de comunicación y sincronización.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Recursos asociados a un proceso

Cada proceso tiene asociados una serie de recursos del sistema:


Una imagen del código máquina del programa
Una parte de memoria, para almacenar el código, los datos
del proceso, la pila de llamadas de sus rutinas...
Descriptores de los recursos del sistema asociados al
proceso (por ejemplo, descriptores de ficheros)
El contexto del proceso: contenido de los registros,
direcciones de memoria...
El sistema operativo almacena la información de los procesos
activos en bloques de control de procesos.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Estados de un proceso

Inicialmente se crea el proceso: se carga


de memoria secundaria a principal.
Después pasa a estado de esperando,
hasta que el scheduler del sistema lo
asigna a un procesador.
Pasa a estado de ejecutándose.
Cuando necesita esperar a que un
recurso esté disponible pasa a
bloqueado, y cuando ya tiene el recurso
pasa a esperando y de ahı́ a
ejecutándose.
Finalmente pasa a terminado.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Planificación de procesos

El sistema operativo puede mantener varias instancias


programas al mismo tiempo: puede haber programas de
usuarios distintos, varias instancias del mismo programa...
Un núcleo ejecuta sólo un proceso en un instante de tiempo.
En sistemas con varios núcleos o procesadores se pueden
asignar procesos distintos a núcleos distintos (ejecución
concurrente).
La asignación y desasignación de procesos a núcleos debe
hacerla el sistema operativo de forma rápida.
Los procesos pueden cambiar de estado por interrupciones
software o hardware.
Un cambio de contexto ocurre cuando un proceso en un
núcleo para y se le asigna otro proceso.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Procesos versus hilos

Un proceso puede tener subprocesos o hilos, que son


secuencias independientes de ejecución dentro del código de
un proceso.
Los hilos son las secuencias más pequeñas de instrucciones
que el sistema operativo puede manejar de forma
independiente.
Los hilos dentro de un proceso comparten más recursos que
los procesos: la memoria, la última instrucción del código,
valores de las variables...
La gestión de hilos por el sistema operativo será más rápida
que la de procesos.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Programación concurrente, paralela y distribuida

Programación Concurrente
Cuando varios elementos de proceso (hilos, procesos)
trabajan de forma conjunta en la resolución de un problema.
Puede ser en un único procesador o núcleo.

Programación Paralela
Es programación concurrente cuando se utiliza para acelerar
la resolución de los problemas,
normalmente usando varios procesadores o núcleos.

Programación Distribuida
Es programación paralela cuando los sistemas están
distribuidos,
por ejemplo una red de procesadores,
con lo que hay que usar paso de mensajes.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Necesarios mecanismos de
creación
ejecución
finalización
comunicación
sincronización
de procesos.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Creación
Se ordena al sistema poner en marcha procesos, y cada proceso tiene
asociadas sus zonas de memoria:
En C:
Con fork se crea un proceso hijo, que tiene una copia de las variables del
proceso padre.
En MPI:
Al lanzar la ejecución con mpicc -np X programa se ponen en marcha X
procesos que ejecutan el mismo código programa y cada uno tiene en su
memoria asociada copias distintas de las variables del programa.
Los procesos pueden empezar a colaborar cuando se inicializa MPI, con
MPI Init.
En Java:
Está la clase ProcessBuilder, y se inicializan con el método start.
También se pueden poner en marcha desde otro proceso con
Runtime.getRuntime().exec("programa").
Y se pueden usar RMI (Java Remote Method Invocation) para invocar
métodos de forma remota, para aplicaciones cliente-servidor.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Ejecución

Una vez puestos en marcha, los procesos trabajan de forma


independiente, ejecutando el mismo o distinto programa, y
cada uno con los datos a él asociados.
Si ejecutan el mismo programa, aunque las variables se
llaman igual, cada proceso trabaja con una copia distinta de
ellas, por lo que la misma variable tiene valores distintos en
procesos distintos.
Hay mecanismos para sincronizar los procesos.
Cuando un proceso necesita datos de otro proceso el acceso
a esos datos se realiza con comunicaciones.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Finalización
La finalización de un proceso supone la liberación de los recursos que se
le asociaron (memoria, variables, descriptores de fichero...).

En C:
Con wait el proceso padre espera a que finalice un proceso hijo.
En MPI:
Los procesos que se lanzaron con mpicc -np X programa acaban
cuando llegan al final del programa.
Al ejecutar MPI Finalize se liberan los recursos generados para
gestionar procesos a través de MPI, y los procesos dejan de poder
colaborar.
En Java:
En la clase ProcessBuilder se pueden usar los métodos
finalize, wait, notify y notifyAll heredados de la clase
Object.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Comunicación

Los procesos acceden a datos asociados a otros procesos por


medio de comunicaciones.
En C:
Los procesos padre e hijo emparentados al ejecutar fork
pueden comunicarse a través de una tuberı́a usando la
función pipe.
En MPI:
Hay comunicaciones punto a punto (MPI Send, MPI Recv, y
otras versiones) y comunicaciones colectivas (MPI Bcast,
MPI Gather...)
En Java:
Ofrece multitud de posibilidades: colas de mensajes, canales,
RMI, sockets, redireccionamiento de flujos de entrada/salida.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos
Elementos de Programación Multiproceso
Entornos de Programación Multiproceso

Sincronización

Los procesos se sincronizan al comunicarse,


pero también al acabar la ejecución, por ejemplo si un
proceso espera a otro en un wait.
En las comunicaciones puede haber sincronización entre dos
procesos (comunicaciones punto a punto, o tuberı́as
asociadas a dos procesos) o entre varios procesos
(comunicaciones colectivas).
Puede ser necesaria sincronización sin comunicar datos, por
ejemplo para esperar que todos los procesos lleguen a un
punto de la ejecución para seguir trabajando juntos. Se
utilizan barreras, en MPI con la función MPI Barrier.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Veremos ejemplos básicos de programación multiproceso:


Uso de pipe en C/C++
Captura de flujo de I/O en Java
MPI
veremos programación por paso de mensajes en MPI
con versiones nuevas de los ejemplos vistos en la
Introducción a la Programación Paralela,
y se podrá trabajar con la prueba PP-FP2014 de la página del
Concurso de Programación Paralela.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Se crea una tuberı́a con una llamada a la función pipe(td),


donde td es un array de dos enteros.
Se escribe en la tuberı́a con write(td[1],dir,tam), con
dir la dirección de comienzo de los datos, y tam la cantidad
de memoria a mandar.
Se recibe a través de la tuberı́a con read(td[0],dir,tam).
Compilar y ejecutar el programa pipe-basico.c,
que suma 10 números utilizando dos procesos.
A diferencia del ejemplo anterior de uso de fork, donde los
procesos se comunicaban a través de la memoria,
en este ejemplo se comunican con la tuberı́a, con una especie de
paso de mensajes.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Ejemplo: ordenación con dos procesos mandando


mensajes por tuberı́a

El programa en programas/C/pipe-ordenacion.cpp realiza una


ordenación con dos procesos,
a diferencia del ejemplofork.cpp en este caso no se comparte
memoria,
sino que se usa una tuberı́a para comunicar datos entre los
procesos.
Las tuberı́as tienen un tamaño por defecto,
por lo que a partir de un tamaño de envı́o el programa no
funcionarı́a.
Para evitar esto, se usa la función fcntl para cambiar el tamaño
máximo de los mensajes por la tuberı́a.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

En los programas maestro.java y esclavo.java tenemos un


ejemplo básico de colaboración entre procesos,
con comuniación a través de los flujos de I/O:
El proceso que ejecuta el programa maestro pone en marcha
la ejecución del esclavo con una llamada a
Runtime.getRuntime().exec
y declara un flujo de entrada para hacer lectura por buffer
inStream = new BufferedReader(new
InputStreamReader(esclavo.getInputStream())
Compilar y ejecutar el programa:
Compilar maestro.java y esclavo.java
Ejecutar maestro N, que pone en marcha esclavo N (donde
N será un número).

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Ejemplo: ordenación con proceso maestro y esclavo


Siguiendo el mismo esquema del ejemplo básico anterior, los programas
maestroOrdenar.java y esclavo.Ordenar.java realizan una ordenación de
números enteros comunicándose con el flujo de entrada.
El número de datos a ordenar se pasa como argumento al maestro.
El esclavo es el que genera los datos, envı́a al maestro la primera mitad, ordena
la segunda mitad y la pasa al maestro ordenada.
El maestro ordena la primera mitad, recibe la segunda ordenada y mezcla las
dos mitades.
Los datos se pasan como cadenas de caracteres, por lo que se hace conversión
de cadenas a enteros.
Analizar la evolución de los tiempos de ejecución secuencial y paralelo
aumentando el tamaño del problema.
El alto coste de las comunicaciones hace que ahora sea necesario aumentar
considerablemente el tamaño de problema para acercarnos a una aceleración de
cuatro veces más rápida la versión paralela respecto a la secuencial.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

MPI (Message Passing Interface) es el estándar de facto


actual para programación en sistemas de memoria
distribuida.
Es una especificación para paso de mensajes.
La primera librerı́a de paso de mensajes estándar y portable.
Realizada por consenso (MPI Forum), con participación de
unas 40 organizaciones.
Acabado y publicado en mayo 1994. Actualizado en junio
1995.
Hay varias versiones y variantes: MPI2, HMPI, FT-MPI...
algunas de ellas libres: MPICH, LAM/MPI, OpenMPI...
Previamente PVM: Parallel Virtual Machine (aprox. 1993).

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Caracterı́sticas generales
Recordamos los aspectos de MPI vistos en el ejemplo
codigo6-16.c:
Se usa la librerı́a mpi.h
Es un programa C con llamadas a la librerı́a MPI.
Las funciones empiezan con MPI .... Hay funciones de:
inicialización (MPI Init) y finalización (MPI Finalize),
para obtener el número de procesos (MPI Comm size) y el
identificador de proceso (MPI Comm rank),
de sincronización (MPI Barrier),
de envı́o (MPI Send) y recepción (MPI Recv)
Se compila con mpicc -O3 codigo6-16.c
Se ejecuta con mpirun -np X ./a.out tam, donde X indica
el número de procesos a usar, y tam el número de datos a
ordenar.
Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas
Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Forma de las funciones

Las funciones tienen la forma:


error=MPI nombre(parámetros)
La de inicialización de MPI es
int MPI Init ( int *argc , char ***argv )
y la de finalización
int MPI Finalize ( )
En algunas funciones aparece la constante MPI
MPI COMM WORD.
Varios procesos MPI se agrupan en un comunicador, y
MPI COMM WORD identifica el comunicador formado por todos
los procesos MPI.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Funciones de identificación

Procesos en el comunicador:
MPI Comm size ( MPI Comm comm , int *size)
devuelve en size el número de procesos en el comunicador
comm.
Si la llamamos con el comunicador MPI COMM WORD devuelve
el número de procesos MPI puestos en marcha.
Identificación de procesos:
MPI Comm rank ( MPI Comm comm , int *rank)
devuelve en rank un identificador para cada proceso.
Los procesos se numeran de 0 al número de procesos menos
1.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Mensajes
En un mensaje se envı́a un cierto número de elementos de un tipo
MPI.
Hay tipos básicos
Tipo MPI tipo C
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

y derivados, que los construye el programador.


Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas
Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Mensajes punto a punto


Interviene un proceso que envı́a y otro que recibe:

Función de envı́o
int MPI Send ( void *buffer , int contador , MPI Datatype
tipo , int destino , int tag , MPI Comm comunicador )
Función de recepción:
int MPI Recv ( void *buffer , int contador , MPI Datatype
tipo , int origen , int tag , MPI Comm comunicador ,
MPI Status *estado)
Se envı́a el número de datos indicado por contador, empezando en la zona de
memoria señalada por el puntero buffer.
Se indica el identificador de proceso que envı́a (origen) y que recibe (destino).
Se puede indicar que se recibe de cualquiera poniendo como origen la constante
MPI ANY SOURCE.
El parámetro tag sirve para diferenciar mensajes. Tiene que tener el mismo
valor en el proceso que envı́a y en el que recibe. Con MPI ANY TAG se indica que
se recibe un mensaje con cualquier valor en ese parámetro.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Comunicaciones sı́ncronas
Con las funciones de comunicación punto a punto anteriores las comunicaciones
son sı́ncronas:

El proceso que envı́a sigue trabajando después de llamar a la función.


El proceso que recibe lee el mensaje si ya ha sido enviado, pero si no
queda a las espera de que se le envı́e.

La función de recepción es siempre MPI Recv,


pero hay varias funciones de envı́o según el grado de sincronización en el envı́o
y dónde queden los datos una vez enviados:

MPI Send: el proceso que envı́a sigue cuando el buffer de salida está
disponible para usarlo.
MPI Rsend: se ejecuta sólo si ya se ha realizado la llamada a recepción, si
no da error.
MPI Ssend: el proceso que envı́a espera hasta que empieza la recepción.
MPI Bsend: cuando se sabe que hay espacio en el buffer de salida. Se
puede reservar espacio con la función MPI Buffer attach.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Comunicaciones ası́ncronas
En las comunicaciones ası́ncronas no espera ninguno de los dos
procesos. Las funciones son:
int MPI Isend ( void *buffer , int contador ,
MPI Datatype tipo , int destino , int tag ,
MPI Comm comunicador , MPI Request *request )
int MPI Irecv ( void *buffer , int contador ,
MPI Datatype tipo , int origen , int tag ,
MPI Comm comunicador , MPI Request *request)
Donde en request se guarda una etiqueta que identifica la
operación. Se puede trabajar con ella:
int MPI Wait ( MPI Request *request , MPI Status
*status ): espera hasta que está disponible la operación.
int MPI Test ( MPI Request *request , int *flag ,
MPI Status *status ): comprueba si está disponible.
Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas
Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Comunicaciones ası́ncronas - Ejemplo

En el directorio programas/MPI/D-Asincrono hay un ejemplo de


uso de comunicaciones ası́ncronas.
Se trata del ejemplo de multiplicación de matrices visto en la
Introducción a la Programación Paralela y que corresponde al
problema D de la prueba PP FP1024 de la página del Concurso de
Programación Paralela.
Se puede analizar su funcionamiento y ejecutarlo en el concurso.
Puede que se observe una ligera reducción en el tiempo de
ejecución respecto a la versión sı́ncrona, pero en cualquier caso la
reducción no será importante debido a la clara estructura del
programa.
Se puede realizar una versión ası́ncrona del problema C, que
corresponde a una ordenación, y probarla en el concurso.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Comunicaciones colectivas
En ellas intervienen todos los procesos en el comunicador. En el ejemplo
anterior hemos visto MPI Bcast, con la que se envı́an datos de un proceso (raı́z)
a todos los demás. Otras operaciones colectivas:
MPI Barrier: no comunica datos, pero bloquea los procesos hasta que la
llaman todos.
MPI Gather: para recibir valores de todos los procesos.
MPI Scatter: para distribuir un buffer entre los procesos.
MPI Alltoall: para enviar datos de todos los procesos a todos.
MPI Reduce: combina valores de todos los procesos en un proceso.
MPI Reduce scatter: combina valores de todos los procesos y distribuye
a todos.

Las operaciones que se pueden hacer en las rutinas de reducción son: máximo (MPI MAX),
mı́nimo (MPI MIN), suma (MPI SUM), producto (MPI PROD), and lógico (MPI LAND), and bit a
bit (MPI BAND), or lógico (MPI LOR), or bit a bit (MPI BOR), or exclusivo lógico (MPI LXOR), or
exclusivo bit a bit (MPI BXOR), máximo y su posición (MPI MAXLOC), mı́nimo y su posición
(MPI MINLOC).
Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas
Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Comunicaciones colectivas - Ejemplo

En el directorio programas/MPI/D-Colectivas hay un ejemplo


de uso de comunicaciones colectivas, donde se ve el
funcionamiento de las funciones MPI Scatter y MPI Gather.
Es el mismo ejemplo de multiplicación de matrices anterior.
Se puede analizar su funcionamiento y ejecutarlo en el concurso.
La principal ventaja de las comunicaciones colectivas es que
facilitan la programación,
y pueden acelerar la ejecución si se usa una implementación de
MPI que tenga optimizadas estas funciones para el sistema donde
estamos trabajando.
Se puede realizar una versión con comunicaciones colectivas del
problema C y probarla en el concurso.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Empaquetamiento de datos

Se pueden empaquetar datos para enviarlos juntos. Por cada dato a


empaquetar se llama a:
int MPI Pack( void *datos, int contador, MPI Datatype tipo,
void *buffer, int tambuffer, int *posicion ptr, MPI Comm
comm)
Se empaquetan en buffer contador datos de tipo tipo que se
encuentran en datos.
El tamaño del buffer (tambuffer) puede ser mayor al que se va a ocupar.
posicion ptr es de entrada-salida. A la entrada apunta a la posición del
buffer donde se van a copiar los datos, y a la salida a la posición siguiente
al último dato empaquetado.
El proceso que recibe desempaqueta los datos en el mismo orden en que
se empaquetaron, llamando por cada dato a la rutina
int MPI Unpack( void *buffer, int tambuffer, int
*posicion ptr, void *datos, int contador, MPI Datatype tipo,
MPI Comm comm)

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas


Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

Empaquetamiento de datos - Ejemplo


En el directorio programas/MPI/D-Empaquetar hay un ejemplo
de uso de comunicación con empaquetamiento, donde se ve el
funcionamiento de las funciones MPI Pack y MPI Unpack.
Es el mismo ejemplo de multiplicación de matrices anterior.
Se puede analizar su funcionamiento y ejecutarlo en el concurso.
Empaquetar varios datos para transferirlos juntos permite reducir
el número de comunicaciones, y puede producir una reducción del
tiempo de ejecución, ya que las comunicaciones son muy
costosas.
Por otro lado, el empaquetamiento también tiene un coste de
gestión de los datos, lo que produce una sobrecarga, y además
mientras el proceso que envı́a está empaquetando el resto están a
la espera. Por tanto no podemos asegurar que siempre sea mejor
empaquetar varios datos para mandarlos juntos.
Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas
Procesos Uso de pipe en C/C++
Elementos de Programación Multiproceso Captura de flujo de I/O en Java
Entornos de Programación Multiproceso MPI

MPI - Otras caracterı́sticas


Hemos visto las caracterı́sticas principales de MPI.
Con las funciones estudiadas se puede realizar cualquier programa de paso de
mensajes, pero MPI ofrece muchas más funciones (más de 120).
Otras posibilidades de MPI:

Tipos derivados: los crea el usuario en tiempo de ejecución. En el ejemplo


anterior se podrı́a crear un tipo formado por una porción de la matriz A y
toda la matriz B , y a partir de ahı́ se podrı́an enviar elementos de ese tipo.
Se pueden crear comunicadores con menos procesos de los que hay en
marcha (menos que MPI COMM WORLD) y hacer comunicaciones colectivas
en ese comunicador, sin necesidad de que se participen el resto de
procesos.
Se pueden definir topologı́as, que son patrones de comunicación entre los
procesos. Hay topologı́as más adecuadas que otras para distintos
esquemas de programa y distintas conexiones de los procesadores, y una
buena selección de la topologı́a puede contribuir a reducir el tiempo de
ejecución.

Univ de Murcia-IES Ing. de la Cierva Paralelismo en la rama de tecnologı́as informáticas

También podría gustarte