Bis jetzt liest meine Anwendung in einer TXT-Datei mit einer Liste von ganzen Zahlen. Diese Ganzzahlen müssen in einem Array durch den Master-Prozess, d. H. Prozessor mit Rang 0, gespeichert werden. Dies funktioniert gut. JetztWie werden MPI_Scatter und MPI_Gather von C verwendet?
, wenn ich das Programm laufen habe ich eine if-Anweisung überprüft, ob es der Master-Prozess ist, und wenn es ist, ich bin die Ausführung des Befehls MPI_Scatter
.
Von was ich verstehe, wird dies das Array mit den Zahlen unterteilen und es an die Slave-Prozesse, d. H. Alle mit Rang> 0 übergeben. Ich bin mir jedoch nicht sicher, wie ich mit der MPI_Scatter
umgehen soll. Wie "abonniert" der Slave-Prozess, um das Sub-Array zu erhalten? Wie kann ich den Nicht-Master-Prozessen mitteilen, etwas mit dem Sub-Array zu tun?
Kann mir bitte jemand ein einfaches Beispiel geben, um mir zu zeigen, wie der Masterprozess Elemente aus dem Array sendet und dann die Slaves die Summe addiert und an den Master zurückgibt, der alle Summen addiert und ausgibt?
Mein Code so weit:
#include <stdio.h>
#include <mpi.h>
//A pointer to the file to read in.
FILE *fr;
int main(int argc, char *argv[]) {
int rank,size,n,number_read;
char line[80];
int numbers[30];
int buffer[30];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
fr = fopen ("int_data.txt","rt"); //We open the file to be read.
if(rank ==0){
printf("my rank = %d\n",rank);
//Reads in the flat file of integers and stores it in the array 'numbers' of type int.
n=0;
while(fgets(line,80,fr) != NULL) {
sscanf(line, "%d", &number_read);
numbers[n] = number_read;
printf("I am processor no. %d --> At element %d we have number: %d\n",rank,n,numbers[n]);
n++;
}
fclose(fr);
MPI_Scatter(&numbers,2,MPI_INT,&buffer,2,MPI_INT,rank,MPI_COMM_WORLD);
}
else {
MPI_Gather (&buffer, 2, MPI_INT, &numbers, 2, MPI_INT, 0, MPI_COMM_WORLD);
printf("%d",buffer[0]);
}
MPI_Finalize();
return 0;
}
Was für eine ausgezeichnete Antwort. Habe es sehr geradlinig gemacht und ich sehe wie es jetzt funktioniert. Ich habe den Fehler gemacht, darüber nicht als kollektive Operationen zu denken. Vielen Dank! – DSF
Wow! Du hast meinen Tag gerettet, Prost. Danke – irobo
Hilfreicher als die meisten MPI Intros – WakaChewbacca