MPIOpenMP PDF Imprimir E-mail

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. <Descargar PDF>  

El uso de programas híbridos 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 por lo que algunos Clusters deberán escalar su versión del compilador.


mixed

 

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.

 

tux

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 híbrido.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                2        0           0              os        install
compute-0-0:   Compute               2        0           0               os        install
compute-0-1:   Compute               2        0           1               os        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 máximo 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 parámetro -hostfile con el archivo hostnodes, además ahora observe que los procesos se están ejecutando en las maquinas compute-0-0 y compute-0-1 que son los nodos de procesamiento y ya no están 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 tendría que especificar en el archivo hostnodes el parámetro slots=1 para todos los nodos del Cluster.

 

También se podría especificar dos procesos MPI uno en cada nodo y cada proceso con dos hilos con OpenMP en forma directa de la siguiente 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

 

 

 

 

 

 

Patrocinadores


CIICAp
Maestrías y Doctorados en: Tecnología Eléctrica, Tecnología Química, Tecnología de Materiales y Tecnología Mecánica.




 

 

Links Relacionados

Mapa de visitas de esta página

Springer
Revista Programación Matemática

Springer

Artículo Mini Grid Morelos
Artículo Mini Grid Morelos

Contador de visitas

mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterHoy48
mod_vvisit_counterAyer53
mod_vvisit_counterEsta semana48
mod_vvisit_counterÚltima semana318
mod_vvisit_counterEste més256
mod_vvisit_counterUltimo més1980
mod_vvisit_countertodos los dìas431855