2016-05-06 10 views
2

Ist es möglich, eine Reihe von Tags für eine MPI_Recv-Funktion anzugeben?Set von MPI-Tags

Mein Szenario:

ich mit einer Anwendung arbeiten, die ich mehrere Threads hat, die gleichzeitig die MPI_Recv Funktion auszuführen. Ich beabsichtige mit dem MPI-Tag zu steuern, welcher Thread die Nachricht erhalten wird. Aber ich muss auch kontrollieren, ob die Nachricht eine data_message oder eine stop_message ist.

Also, ist es möglich, eine Reihe von Tags für MPI_Recv zu definieren? Semantisch wäre etwas wie "Empfangen von Nachrichten mit Tags 0 oder 1" oder "Empfangen von Nachrichten mit Tags 10 oder 11" usw. Es müssen mehrere Werte sein.

Mit diesem Ansatz wäre möglich, die Tagsthread_id * 2 als data_message und thread_id * 2 + 1 als stop_message zu verwenden.

Antwort

1

Ich würde lieber eine leere Nachricht verwenden (MPI_Send(count = 0)) den Stoppzustand in Ihrem Fall zu signalisieren. Warten Sie einfach auf eine übereinstimmende Nachricht mit MPI_Probe(tag = thread_id) und verwenden Sie dann MPI_Get_count für das zurückgegebene Statusobjekt, um die Nachrichtengröße zu bestimmen. Sollte es Null sein, brechen Sie die Verarbeitungsschleife.

Eine weitere Option besteht darin, jeden Thread in einem separaten Communicator kommunizieren zu lassen. Verwenden Sie MPI_Comm_dup, um ein Array von Duplikaten von MPI_COMM_WORLD zu erstellen, und führen Sie dann den Thread i in comms[i] kommunizieren. Sie können dann MPI_Recv(tag = MPI_ANY_TAG, comm = comms[i]) verwenden, um Nachrichten mit einem beliebigen Tag abzugleichen, das Thread-spezifisch ist. Verwenden Sie auf der Senderseite MPI_Send(rank = dest, comm = comms[i]), um den Thread i mit dem Rang Ziel zu adressieren.

1

Es gibt keine direkte Funktion, um einen bestimmten Satz von Tags zu finden (da MPI_TAG_ANY hier wegen Unspezifität nicht geeignet wäre), aber es gibt eine Möglichkeit, das gleiche Ziel zu erreichen. Geben Sie in jedem Thread zwei MPI_Irecv Anforderungen ein, eine für jedes Tag, das Sie abgleichen möchten. Verwenden Sie dann MPI_waitany oder MPI_Testany zu sehen, was kommt.

+2

'MPI_Testany' und' MPI_Waitany' sind Quellen der Nichtdeterminierung. Es funktioniert nur, wenn das OP garantieren kann, dass keine _stop_message_ gesendet wird, bevor der Empfang der vorhergehenden _data_message_ irgendwie garantiert wurde. –

+1

Das ist ein guter Punkt. Mein Vorschlag hängt davon ab, dass nur die eine oder die andere der Nachrichten zur Verfügung steht, die übereinstimmen, da die Semantik der Reihenfolge zwischen verschiedenen angegebenen Tags auf verschiedenen Empfängen nicht hilft. – Novelocrat