Frage

Ich arbeite mit MPI -Programmen an einem SMP -Supercomputer. Ich möchte feststellen, welche Prozesse denselben Knoten teilen, beispielsweise indem ich einen Ganzzahlschlüssel festlegt, der in allen Prozessen auf demselben Knoten gleich ist und sich von einem Knoten zu einem anderen unterscheidet. Das Ziel wäre dann, diesen Schlüssel zu verwenden, um einen Kommunikator zu teilen und Unterkommunikatoren zu haben, die nur die Prozesse im selben Knoten sammeln.

Die Funktion würde also so aussehen

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

Angenommen, eine einfache Verteilung von Prozessen wie 0,1,2,3 auf NODE_1, 4,5,6,7 auf NODE_2 usw. Es ist eine Frage einer einfachen Formel, aber ich möchte das gleiche Ergebnis ohne Annahme erzielen auf die Verteilung.

Ich habe eine Idee, wie man das mit mpi_get_processor_name macht: Durch Berechnen eines Hashs des Namen Seien Sie schwierig, das Problem zu verfolgen) oder verwenden Sie einen Übereinstimmungsalgorithmus über Prozesse hinweg (welches? Ich weiß es noch nicht).

Wie würden Sie das machen (wenn möglich effizient)?

Matthieu

War es hilfreich?

Lösung

Sie haben Recht, dass eine Annahme in der Verteilung unklug wäre, da die Rangrekorde tatsächlich eine aufstrebende Technik ist, um die Leistung auf Kosten dieser Regelmäßigkeit zu verbessern.

Ein guter Hashing -Algorithmus für den Rückgabewert von MPI_Get_processor_name Sollte ziemlich sicher sein, aber wenn Sie überprüfen möchten, können Sie die tatsächlichen Namen in jeder Gruppe immer sammeln MPI_Gatherv und vergleichen Sie sie direkt.

Es scheint diese Frage befasst sich mit den gleichen Bedenken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top