MPI-Richtlinie für mehrere asynchrone Übertragungen


8

Was ist die Richtlinie für mehrere überlappende asynchrone Übertragungen in MPI?

Ich habe ein Programm mit mehreren offenen asynchronen irecvOperationen. Ich finde, dass Übertragungen, die stattfinden könnten (der entsprechende isendwurde aufgerufen), auf andere Übertragungen warten, die noch nicht bereit sind (der entsprechende isendwurde noch nicht aufgerufen). Um klar zu sein, diese Ineffizienz beruht nicht auf Netzwerkkonflikten. Mein Netzwerk ist unnötig inaktiv.

Mein Programm sieht folgendermaßen aus:

Maschine 1

call irecv(variable A from machine 2)
call irecv(variable B from machine 2)
call irecv(variable C from machine 2)
call wait(variable C from machine 2)
call do_important_work_with(variable C)
....

Maschine 2

call isend(variable C to machine 1)
call isend(variable B to machine 1)
call do a bunch of costly work
call isend(variable A to machine 1)
....

Problem

Die Übertragung von Cscheint durch die Übertragung von unnötig blockiert zu werden A.

Ich stelle fest, dass das waitEinschalten variable Cauf Maschine 1 erst abgeschlossen ist, nachdem die kostspielige Arbeit auf Maschine 2 abgeschlossen ist. Dies ist bedauerlich, da diese Übertragung zu Beginn meines Programms hätte beginnen können. Es scheint unnötig zu warten, bis die Übertragung Aabgeschlossen ist.

Fragen

Insbesondere habe ich eine Berechnung wie die folgende.

  • Wird das erwartet?
  • Was ist die Richtlinie für mehrere überlappende asynchrone Übertragungen?
  • Kann dies vermieden werden, ohne meinen Code neu zu ordnen (gibt es relevante interne Einstellungen)?
  • Wohin soll ich gehen, um mehr über die Richtlinien von MPI für mehrere Live-Übertragungen zu erfahren?

Wie groß sind die Überweisungen? Übertragungen mit derselben Unterschrift müssen in der richtigen Reihenfolge erfolgen. Verwenden Sie unterschiedliche Tags für die verschiedenen Übertragungen? Außerdem sollte es keine Rolle spielen, welchen MPI-Stack Sie verwenden. Die Semantik der Reihenfolge der Übertragungen wird durch die MPI-Standards definiert.
Bill Barth

Die Übertragungen sind groß (ca. 1 MB) und haben dieselbe Größe / Quelle / Ziel (ist dies die Signatur?). Sie haben verschiedene Tags.
MRocklin

Verschiedene Tags sollten es ihnen ermöglichen, in beliebiger Reihenfolge zu arbeiten, aber die Hardware muss die Daten tatsächlich verschieben, und das kann sie nicht wirklich parallel tun. Wenn es sich also um eine große Nachricht handelt, warten Sie möglicherweise auf die zugrunde liegende Hardware, um A und B in interne Puffer zu kopieren oder auf die Netzwerkkarte zu übertragen (je nachdem, über welche Hardware Sie verfügen). Ich würde empfehlen, die Reihenfolge zu ändern, in der Sie die Empfänge senden, und je nach Hardware einen anderen Stack (MPICH, MVAPICH, Intel MPI usw.) zu verwenden. Sie können auch versuchen, Fortschritts-Threads zu aktivieren.
Bill Barth

Wenn Sie diese Art von Kommunikationsmuster bereits über Ethernet haben, würde ich dringend empfehlen, zmq anstelle von mpi zu verwenden.
Meawoppl

Antworten:


6

Der Standard gibt keine Garantie dafür, dass bei den nicht blockierenden Sendungen Fortschritte erzielt werden, bis Sie tatsächlich anrufen MPI_WAIT. Es ist eine absolut gültige Implementierung, um nur die Vorgänge in die Warteschlange zu stellen, und wenn Sie aufrufen MPI_WAIT, werden alle MPI_ISENDVorgänge auf einmal abgeschlossen. In der Realität haben sie normalerweise die Möglichkeit, bei jedem Aufrufen der MPI-Bibliothek Fortschritte zu erzielen. Wenn Sie asynchrone Fortschritts-Threads aktivieren, haben sie eine bessere Chance, im Hintergrund Fortschritte zu erzielen.

In Bezug auf das Signaturproblem garantiert MPI, dass Nachrichten auf demselben Kommunikator in denselben Rängen in derselben Reihenfolge empfangen werden, in der sie gesendet wurden.

Aus dem MPI Standard Version 3.0:

Bestellnachrichten überholen nicht: Wenn ein Absender zwei Nachrichten nacheinander an dasselbe Ziel sendet und beide mit demselben Empfang übereinstimmen, kann dieser Vorgang die zweite Nachricht nicht empfangen, wenn die erste noch aussteht. Wenn ein Empfänger zwei Empfänge nacheinander sendet und beide mit derselben Nachricht übereinstimmen, kann die zweite Empfangsoperation von dieser Nachricht nicht erfüllt werden, wenn die erste noch aussteht.

Dies sagt nichts darüber aus, wie die Implementierung die Nachrichten sendet, aber zumindest werden sie in der richtigen Reihenfolge empfangen.

Mein Rat wäre, zuerst sicherzustellen, dass Sie Fortschritts-Threads aktiviert haben, und dann sicherzustellen, dass Sie warten, wo Sie die gesendeten Nachrichten wirklich benötigen (obwohl Sie mit Fortschritts-Threads höchstwahrscheinlich in Ordnung sind).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.