MPI + OpenMP Bienvenido a la Grid Morelense de Alto Rendimiento

Transcripción

MPI + OpenMP Bienvenido a la Grid Morelense de Alto Rendimiento
MPI + OpenMP
Bienvenido a la Grid Morelense de Alto Rendimiento
En esta sección mostramos como hacer uso de programas con OpenMPI+OpenMP. Primeramente
refiérase a como tener acceso al Cluster.
El uso de programas hibridos con MPI y OpenMP tratan de hacer un uso mas eficaz y eficiente de
un Cluster de alto rendimiento, lo primero que se debe observar es que el compilador de soporte
tanto a OpenMP como a MPI. A partir de GCC 4.2 se da soporte a OpenMP po lo que algunos
Clusters deberan escalar su version del compilador.
La imagen muestra que MPI se utiliza para el pase de mensajes entre los nodos del Cluster y
OpenMP utiliza la memoria compartida de los procesadores con el uso de hilos, el numero de hilos
va de acuerdo al numero de procesadores de determinado nodo.
Para compilar y ejecutar programas con MPI + OpenMP use: mpicc
-fopenmp -o <ejecutable> <fuente> donde ejecutable es el nombre del
archivo de salida y fuente es el archivo a compilar o programa fuente con
extesion .c.
#include <stdio.h>
#include "mpi.h"
#include <omp.h>
int main(int argc, char *argv[]) {
int numprocs, rank, namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
int iam = 0, np = 1;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);
#pragma omp parallel default(shared) private(iam, np)
{
np = omp_get_num_threads();
iam = omp_get_thread_num();
printf("Hola del hilo %d de un total de %d procesadores (hilos) ejecutado dentro del proceso %d de un total de %d
procesos %s\n",
iam, np, rank, numprocs, processor_name);
}
MPI_Finalize();
}
Así para compilar este programa llamado hibrido.c seria.
[[fjuarez@gridmorelos ~]$ mpicc -fopenmp -o hibrido hibrido.c
Si se requiere agregar funciones matemáticas agregue la librería con: mpicc -lm -fopenmp -o
<ejecutable> <fuente>.
Ejecución de trabajos com MPI. Utilice mpirun -np <#procesos> <ejecutable>, donde #procesos
es el numero decimal de los procesos que quiere ejecutar a lo largo del Cluster y el ejecutable es el
archivo de salida al compilarlo con mpicc.
[fjuarez@gridmorelos ~]$ mpirun -np 2 ./hibrido
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 0 de un total de 2
procesos gridmorelos.uaem.mx
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 0 de un total de 2
procesos gridmorelos.uaem.mx
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 1 de un total de 2
procesos gridmorelos.uaem.mx
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 1 de un total de 2
procesos gridmorelos.uaem.mx
[fjuarez@gridmorelos ~]$
Observe que este programa lanza un numero de hilos que es proporcional al numero de
procesadores del nodo, que en este caso son dos, por tanto al decidir lanzar dos procesos MPI, cada
uno de ellos lanza dos hilos con OpenMP. Se puede simular un numero de procesadores mayor que
el real exportando la variable del sistema OMP_NUM_THREADS.
Observe que no se esta usando los nodos del Cluster ya que la maquina gridmorelos.uaem.mx es el
front-end o nodo maestro, para usar los nodos del Cluster se requiere crear un archivo de hosts, las
características puede obtenerlas utilizando los comandos de Cluster de esta forma:
[fjuarez@gridmorelos ~]$ rocks list host
HOST
MEMBERSHIP CPUS RACK RANK RUNACTION INSTALLACTION
gridmorelos: Frontend
compute-0-0: Compute
compute-0-1: Compute
...
2
2
2
0
0
0
0
0
1
os
os
os
install
install
install
Aquí puede observar el nombre de los nodos y el numero de CPU's, ahora creamos un archivo
llamado hostsnodes de la siguiente manera
compute-0-0 slots=2 max_slots=99
compute-0-1 slots=2 max_slots=99
...
Donde slots indica el numero de CPU's que tiene un nodo en particular y max_slots el máximo
numero de procesos que se podrían correr, esta ultimo parámetro se utiliza para simular un numero
maximo de CPU's mayor al real y puede omitirse. Ahora ejecutamos el mismo programa anterior:
[fjuarez@gridmorelos ~]$ mpirun -np 4 ./hibrido
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 0 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 0 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 3 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 2 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 2 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 3 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 1 de un total de
4 procesos gridmorelos.uaem.mx
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 1 de un total de
4 procesos gridmorelos.uaem.mx
Observe que usamos el parametro -hostfile con el archivo hostnodes, ademas ahora observe que los
procesos se estan ejecutando en las maquinas compute-0-0 y compute-0-1 que son los nodos de
procesamiento y ya no estan usando la maquina gridmorelos.uaem.mx que es el front-end, si
requiere hacer del front-end como un nodo de procesamiento incluyalo en el archivo hostnodes. De
la misma manera que en el ejemplo anterior, el numero de hilos lanzado por cada proceso se
multiplica por dos, por lo si requiere tener exactamente un numero de hilos con OpenMP
equivalente al numero de procesadores de cada nodo se tendria que especificar en el archivo
hostnodes el parámetro slots=1 para todos los nodos del Cluster.
Tambien se podria especificar dos procesos MPI uno en cada nodo y cada proceso con dos hilos con
OpenMP en forma directa de la siguinte manera: mpirun -host compute-0-0,compute-0-1 -np
2 ./holamundo y el resultado es el mismo.
[fjuarez@gridmorelos ~]$ mpirun -host compute-0-0,compute-0-1 -np 2 ./hibrido
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 0 de un total de 2
procesos compute-0-0.local
Hola del hilo 0 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 1 de un total de 2
procesos compute-0-1.local
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 0 de un total de 2
procesos compute-0-0.local
Hola del hilo 1 de un total de 2 procesadores (hilos) ejecutado dentro del proceso 1 de un total de 2
procesos compute-0-1.local

Documentos relacionados