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