2016-05-03 10 views
0

Ich habe mich gefragt, ob es eine kluge Möglichkeit gibt, dies zu tun. Lassen Sie uns sagen, ich habe drei Knoten, 0, 1, 2. Und sagen wir, jeder Knoten hat ein Array, a0, a1, a2. Wenn der Inhalt von jedem Knoten so etwas wieMPI-Kommunikationsmuster

a0 = {0, 1, 2, 1} 
a1 = {1, 2, 2, 0} 
a2 = {0, 0, 1, 2} 

Gibt es ein cleveres Kommunikationsmuster so ist jede Zahl zu bewegen, um es Knotens entspricht, dh

a0 = {0, 0, 0, 0} 
a1 = {1, 1, 1, 1} 
a2 = {2, 2, 2, 2} 

Der Ansatz, den ich im Sinne habe, würde bedeuten, das Sortieren und vorübergehende Puffer, aber ich fragte mich, ob es einen klügeren Weg gab?

+2

Ich verstehe nicht - kann du nicht nur füllen a0 mit 0, a1 mit 1 usw.? Vermutlich gibt es mehr zu Ihrem Problem, als Ihr Beispiel zeigt. Es ist auch nicht klar, was Sie mit "drei Knoten, 0, 1, 2" meinen und wie sich das auf die MPI "Knoten" (Computer) oder die 0,1,2 Werte in Ihren Arrays bezieht. –

+0

Danke John. Ich schätze, Zulan ist auf dem richtigen Weg. Die drei Knoten sind separate Computer. Ja, es gibt mehr zu dem Problem. Ich habe nur die Werte im Array gewählt, um meine Absicht klarer zu machen. Ich schätze, ich scheiterte an diesem xp – inJeans

Antwort

1

Sie können in der folgenden Weise MPI_Alltoallv für diesen Einsatz:

  1. Sortieren der local_data (a), indem in aufsteigender Reihenfolge Knoten jedes Elements entspricht.
  2. Erstellen Sie ein send_displacements Array, sodass send_displacements[r] den Index des ersten Elements in local_data angibt, das sich auf den Knoten r bezieht.
  3. Erstellen Sie ein send_counts Array, sodass send_counts[r] der Anzahl der Elemente in local_data entspricht, die dem Knoten r entsprechen. Dies kann send_counts[r] = send_displacements[r+1] - send_displacements[r] außer dem letzten Rang berechnet werden.
  4. MPI_Alltoall(send_counts, 1, MPI_INT, recv_counts, 1, MPI_INT, comm)
  5. Compute recv_displacements so dass recv_displacements[r] = sum(recv_counts[r'] for all r' < r).
  6. Bereiten Sie einen recv_data mit sum (recv_counts) Elementen vor.
  7. MPI_Alltoallv(local_data, send_counts, send_displacements, MPI_INT, recv_data, recv_counts, recv_displacements, MPI_INT, comm)
+0

Danke Zulan Ich denke, das ist der Ansatz, den ich im Sinn hatte (obwohl etwas mehr ausgearbeitet). Ist das ein typisches Kommunikationsmuster für diese Art von Problem? – inJeans

+0

Ich würde sagen, das ist eine sehr idiomatische Art, dieses Problem anzugehen. Ich denke jedoch nicht, dass dies ein allgemeines Problem ist. – Zulan