Do tej pory moja aplikacja czyta w pliku txt listę liczb całkowitych. Te liczby całkowite muszą być przechowywane w tablicy przez proces główny, tj. Procesor z pozycją 0. Działa to dobrze.W jaki sposób MPI_Scatter i MPI_Gather są używane z C?
Teraz po uruchomieniu programu mam instrukcję if sprawdzającą, czy jest to proces główny, a jeśli tak, to wykonuję polecenie MPI_Scatter
.
Z tego co rozumiem, podzieli tablicę z liczbami i przekaże ją procesom slave, czyli wszystkim o pozycji> 0. Jednak nie jestem pewien, jak obsługiwać MPI_Scatter
. W jaki sposób proces podrzędny "subskrybuj", aby uzyskać tablicę podrzędną? W jaki sposób mogę powiedzieć procesom innym niż wzorcowe, aby coś zrobiły z tablicą podrzędną?
Czy ktoś może podać prosty przykład, aby pokazać mi, w jaki sposób główny proces wysyła elementy z tablicy, a następnie czy niewolnicy dodają sumę i zwracają ją do wzorca, która dodaje wszystkie sumy i wypisuje je?
Mój kod do tej pory:
#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;
}
Co doskonałą odpowiedzią. Zrobiłem to bardzo prosto i widzę, jak to działa teraz. Popełniłem błąd, nie myśląc o tym jako o operacjach zbiorowych. Wielkie dzięki! – DSF
Wow! Uratowałeś mi dzień, Na zdrowie. Dziękujemy – irobo
Bardziej przydatne niż większość wejść MPI – WakaChewbacca