LAM/MPI y mis problemas con MPI_Scatter / MPI_Gather

He tenido un problema mientras utilizaba LAM/MPI para generar un pequeño programa ejemplo que hiciera uso de MPI_Spawn, MPI_Gather y MPI_Scatter. Situémonos en contexto.

En MPI-2 hay dos tipos de comunicadores, el intracomunicador y el intercomunicador. Un intracomunicador es un comunicador como el definido en el estándar MPI-1: todos los procesos del comunicador se comunican de igual a igual.

Sin embargo, el intercomunicador define dos grupos de procesos, el local y el remoto (nombres arbitrarios que dependen del punto de vista del proceso actual), que podemos denominar A y B.

Supongamos que un proceso M ha realizado una llamada a MPI_Spawn generando un conjunto de K procesos S. Ahora el proceso M puede utilizar el intercomunicador que devolvió MPI_Spawn para comunicarse con los procesos de K, y cualquier proceso de K puede llamar a MPI_Comm_get_parent para obtener un intercomunicador que le permita comunicarse con proceso que lo creó. El intercomunicador obtenido en ambos casos es el mismo.

El intercomunicador tiene dos grupos, el grupo A conteniendo al “proceso” M y el grupo B conteniendo los K procesos. Una llamada a MPI_Gather o MPI_Scatter funciona de forma distinta cuando se utiliza un intercomunicador que cuando se utiliza un intracomunicador. La principal ventaja del intercomunicador en este caso es que el proceso M puede comunicarse con todos los procesos del conjunto S mediante MPI_Scatter y MPI_Gather sin recibir el mismo ningún paquete de datos (cosa que ocurre cuando se utiliza un intercomunicador).

Para que el esquema funcione del modo que deseamos, utilizamos una constante de MPI denominada MPI_ROOT, que define un proceso como origen de los datos. Utilizando en el proceso M:

MPI_Scatter(sendbuf, n, MPI_INT, NULL, 0, MPI_INT, MPI_ROOT, comm);

y en todos los procesos de K:

MPI_Scatter(NULL, 0, MPI_INT, recvbuf, n, MPI_INT, rank, parent_comm);

Donde rank es el rango del proceso M en el grupo A. Muy posiblemente rank sea 0 cuando en A sólo hay un proceso; podrí­a ser que el grupo A tuviera más de un proceso (el “proceso” M que creó el conjunto S era un conjunto de procesos M’) y en este caso los otros procesos de A pasarí­an MPI_PROC_NULL en lugar de MPI_ROOT.

Pues bien, esto funciona bien en MPICH2, aunque en LAM/MPI 7.1.1 no funciona. Estoy compilando LAM/MPI 7.1.2 para asegurarme de que no ha sido corregido desde la versión anterior. MPICH2 no termina de gustarme porque no es todo lo transparente que necesito que sea. En DaVinci se utiliza un wrapper para ejecutar correctamente el verdadero intérprete, y ese wrapper da problemas cuando se ejecuta con el mpiexec de MPICH2.

Posted By dsuarez

David nació en Las Palmas de Gran Canaria, España. Estudió Ingeniería en Informática en la Universidad de Las Palmas de Gran Canaria (ULPGC), donde ha trabajado en investigación los últimos años. Siempre ha sentido una gran curiosidad por los ordenadores y las ciencias, y más recientemente en el mundo empresarial. Ha trabajado como programador/analista, consultor en tecnologías de la información y obtuvo la beca de Google Summer of Code en 2006. Es socio fundador de Wantudu (http://wantudu.es), empresa especializada en terminales táctiles para hoteles.

Leave a Reply