Pregunta

Quiero realizar fácilmente las comunicaciones colectivas indepandently en cada máquina de mi clúster. Digamos que tengo 4 máquinas con 8 núcleos en cada uno, mi programa MPI correría 32 tareas MPI. Lo que me gustaría es, para una función dada:

  • en cada host, sólo una tarea realizar un cálculo, otras tareas no hace nada durante este cálculo. En mi ejemplo, 4 tareas MPI van a hacer el cálculo, otros 28 están a la espera.
  • Una vez que el cálculo se realiza, cada tarea de MPI en cada llevará a cabo una comunicación colectiva sólo a las tareas locales (tareas que se ejecutan en el mismo host).

Conceptualmente, entiendo que debo crear un comunicador para cada huésped. Busqué y encontré nada que hacer explícita. No estoy realmente cómodo con grupos MPI y comunicadores. Aquí mis dos preguntas:

  • Se MPI_Get_processor_name es lo suficientemente único para este tipo de comportamiento?
  • manera más general, ¿tiene una pieza de código haciendo eso?
¿Fue útil?

Solución

La especificación dice que MPI_Get_processor_name devuelve "Un especificador único para el real (en contraposición a virtual) nodo", por lo que creo que estaría bien con eso. Supongo que haría un reúnen para reunir todos los nombres de host y luego asignar grupos de procesadores para ir fuera y hacer que sus comunicadores; o MPI_COMM_WORLD dup, gire los nombres en hashes enteros, y el uso mpi_comm_split para particionar el conjunto.

También puede tomar la janneb enfoque sugiere el uso y las opciones de implementación específicas para mpirun para asegurar que las tareas de implementación MPI cesionarios de esa manera; OpenMPI utiliza --byslot para generar este ordenamiento; con mpich2 puede utilizar -print-rank-mapa para ver la asignación.

Pero es esto realmente lo que quiere hacer? Si los otros procesos están sentados sin hacer nada mientras que un procesador está funcionando, ¿cómo es esto mejor que todos redundante hacer el cálculo? (¿O es esta misma memoria o E / S intensiva, y que está preocupado por la contención?) Si usted va a estar haciendo mucho de esto - el tratamiento de la paralelización de nodos muy diferente de paralelización fuera del nodo - a continuación, es posible que desee pensar en modelos de programación híbridos -. ejecutan una tarea MPI por nodo y MPI_spawning subtareas o utilizando OpenMP para comunicaciones a nodo, tanto como lo sugiere HPM

Otros consejos

No creo que (el pensamiento educado, no definitiva) que usted será capaz de hacer lo que quiera en su totalidad desde el programa de MPI.

La respuesta del sistema a una llamada a MPI_Get_processor_name es dependiente del sistema; en su sistema podría volver node00, node01, node02, node03 según el caso, o podría volver my_big_computer por cualquier procesador está ejecutando en realidad. El primero es más probable, pero no está garantizada.

Una estrategia sería iniciar 32 procesos y, si se puede determinar qué nodo se estén ejecutando en, particionar el comunicador en 4 grupos, uno en cada nodo. De esta manera se puede gestionar inter e intra-comunicaciones a sí mismo como desee.

Otra estrategia sería la de iniciar procesos 4 y el pin a diferentes nodos. ¿Cómo usted fija a los procesos de nodos (o procesadores) dependerá de su tiempo de ejecución MPI y cualquier sistema de gestión de trabajos que pueda tener, tales como Grid Engine. Esto probablemente implicará establecer variables de entorno - pero no nos dicen nada acerca de su sistema en tiempo de ejecución por lo que no puede adivinar lo que podría ser. A continuación, podría tener cada uno de los 4 procesos dinámicamente desove de otros 7 (u 8) procesos y el pin aquellos al mismo nodo que el proceso inicial. Para ello, leer sobre el tema de intercomunicadores y la documentación del sistema de tiempo de ejecución.

Una tercera estrategia, ahora se está haciendo un poco loco, sería comenzar 4 programas separados MPI (8 procesos cada uno), uno en cada nodo del clúster y, a unirse a ellos mientras se ejecutan. Lee sobre MPI_Comm_connect y MPI_Open_port para más detalles.

Por último, para la diversión adicional, usted podría considerar la hibridación de su programa, que ejecuta un proceso de MPI en cada nodo, y tienen cada uno de esos procesos de ejecutar un programa OpenMP memoria compartida (sub).

Normalmente el entorno de ejecución MPI se puede controlar, por ejemplo, por variables de entorno cómo las tareas se distribuyen entre los nodos. El valor por defecto tiende a ser la asignación secuencial, es decir, por su ejemplo con 32 tareas distribuidas en 4 máquinas de 8 núcleos que tendría

  • Máquina 1: MPI clasifica 0-7
  • máquina 2: MPI clasifica 8-15
  • máquina 3: MPI clasifica 16-23
  • Máquina 4: MPI clasifica 24-31

Y sí, MPI_Get_processor_name debe conseguir que el nombre de host para que pueda averiguar dónde están los límites entre los anfitriones son.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top