2011-11-29 15 views
5

Estoy trabajando con programas MPI en una supercomputadora SMP. Me gustaría identificar qué procesos están compartiendo el mismo nodo, por ejemplo, estableciendo una clave entera que es igual en todos los procesos en el mismo nodo y diferente de un nodo a otro. El objetivo sería entonces usar esta clave para dividir un comunicador y tener subcomunicadores reuniendo solo los procesos en el mismo nodo.MPI: obteniendo el número de nodos (no procesos) en un comunicador

Así que la función se vería como

int identify_node(MPI_Comm* comm); // returns a key characterizing a node 

Suponiendo una distribución sencilla de los procesos como en nodo_1 0,1,2,3, 4,5,6,7 en nodo_2, etc, es una cuestión de una fórmula simple, pero me gustaría lograr el mismo resultado sin suponer en la distribución.

Tengo una idea de cómo hacerlo usando MPI_Get_processor_name: calculando un hash del nombre y supongo que no hay dos nombres que obtengan el mismo hash (no me gusta porque si un día tengo dos nombres con el mismo hash, será difícil rastrear el problema), o usar algún tipo de algoritmo de acuerdo entre procesos (¿cuál? No lo sé aún).

¿Cómo harías eso (de manera eficiente si es posible)?

Matthieu

Respuesta

3

Tienes razón que una suposición sobre la distribución sería prudente, ya reordenamiento rango es en realidad una técnica de arriba-y-venir para mejorar el rendimiento a costa de que la regularidad.

Un buen algoritmo de hash en el valor de retorno de MPI_Get_processor_name debe ser bastante segura, pero si quieres volver a verificar, siempre se puede recoger los nombres reales dentro de cada grupo utilizando MPI_Gatherv y compararlos directamente.

Parece que this question responde a las mismas preocupaciones.

+0

Gracias, la pregunta que mencionas es bastante cercana. Creo que haré lo que me aconsejo: obtener un hash del nombre del procesador, luego realizar un segundo control con MPI_Gatherv. – sunmat

Cuestiones relacionadas