Pregunta

Estoy trabajando con programas MPI en una supercomputadora SMP. Me gustaría identificar qué procesos comparten el mismo nodo, por ejemplo, estableciendo una clave entera que sea igual en todos los procesos en el mismo nodo, y diferente de un nodo a otro. El objetivo sería usar esta clave para dividir un comunicador y hacer que los subcomunicadores recopilen solo los procesos en el mismo nodo.

Entonces la función se vería como

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

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

Tengo una idea de cómo hacerlo usando mpi_get_processor_name: calculando un hash del nombre y asumir que no hay dos nombres obtendrán el mismo hash (no me gusta esto porque si algún día tengo dos nombres con el mismo hash, lo hará. Sea difícil rastrear el problema) o utilice algún tipo de algoritmo de acuerdo en todos los procesos (¿cuál? No lo sé todavía).

¿Cómo harías eso (eficientemente si es posible)?

Matthieu

¿Fue útil?

Solución

Tiene razón en que una suposición de la distribución sería imprudente, ya que el reordenamiento de rango es en realidad una técnica prometedora para mejorar el rendimiento a costa de esa regularidad.

Un buen algoritmo de hash en el valor de retorno de MPI_Get_processor_name Debería ser bastante seguro, pero si desea verificar dos veces, siempre puede reunir los nombres reales dentro de cada grupo usando MPI_Gatherv y compararlos directamente.

Parece esta pregunta aborda las mismas preocupaciones.

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