Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proyecto Universidad-Secundaria
Incorporación de contenidos de programación paralela en
la rama de tecnologı́as informáticas
Programación Multiproceso
Posible utilización
Contenido
1 Procesos
Concepto de proceso
Estados de un proceso
Planificación de procesos
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.
Necesarios mecanismos de
creación
ejecución
finalización
comunicación
sincronización
de procesos.
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.
Ejecución
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.
Comunicación
Sincronización
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
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.
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
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.
Comunicaciones sı́ncronas
Con las funciones de comunicación punto a punto anteriores las comunicaciones
son sı́ncronas:
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.
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 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
Empaquetamiento de datos