Question

Je travaille avec des programmes MPI sur un super-ordinateur SMP. Je voudrais identifier les processus partagent le même noeud, par exemple en définissant une clé entière qui est égale dans tous les processus sur le même nœud, et différent d'un noeud à un autre. L'objectif serait alors d'utiliser cette touche pour diviser un communicateur et avoir des sous-communicateurs ne recueillir que les processus dans le même nœud.

Alors la fonction ressemblerait

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

En supposant une répartition simple des processus tels que 0,1,2,3 sur node_1, 4,5,6,7 sur node_2, etc., il est une question d'une formule simple, mais je voudrais obtenir le même résultat sans hypothèse sur la distribution.

J'ai une idée comment faire en utilisant MPI_Get_processor_name: en calculant un hachage du nom et assumer aucun deux noms sera obtenir le même hachage (je ne aime pas cela parce que si un jour j'ai deux noms avec le même hachage , il sera difficile de suivre le problème), ou utiliser une sorte d'algorithme d'accord entre les processus (lequel? Je ne sais pas encore).

Comment voulez-vous faire (efficacement si possible)?

Matthieu

Était-ce utile?

La solution

Vous avez raison qu'une hypothèse sur la distribution serait peu judicieux, puisque réordonnancement de rang est en fait un plein d'avenir technique pour améliorer la performance au coût de cette régularité.

Un bon algorithme de hachage sur la valeur de retour de MPI_Get_processor_name devrait être assez sûr, mais si vous souhaitez effectuer une double vérification, vous pouvez toujours ramasser les noms réels au sein de chaque groupe à l'aide MPI_Gatherv et de les comparer directement.

Il semble adresses de cette question, les mêmes préoccupations.

scroll top