Finora, la mia applicazione sta leggendo in un file txt con un elenco di numeri interi. Questi numeri interi devono essere memorizzati in un array dal processo master, cioè processore con grado 0. Funziona correttamente.Come vengono utilizzati MPI_Scatter e MPI_Gather da C?
Ora, quando eseguo il programma, ho un'istruzione if che controlla se si tratta del processo principale e, in caso affermativo, sto eseguendo il comando MPI_Scatter
.
Da quello che ho capito, suddividerà l'array con i numeri e lo passerà ai processi slave, cioè tutti con rank> 0. Tuttavia, non sono sicuro di come gestire lo MPI_Scatter
. In che modo lo slave processa "subscribe" per ottenere il sub-array? Come posso dire ai processi non-master di fare qualcosa con il sotto-array?
Qualcuno può fornire un semplice esempio per mostrarmi come il processo master invia elementi dall'array e poi fare in modo che gli slave aggiungano la somma e la restituiscano al master, che somma tutte le somme e le stampa?
Il mio codice finora:
#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;
}
Che una risposta eccellente. Ho fatto in modo molto semplice e vedo come funziona ora. Ho fatto l'errore di non pensarci come operazioni collettive. Grazie mille! – DSF
Wow! Mi hai salvato la giornata, Saluti. Grazie – irobo
Più utile della maggior parte della maggior parte delle intrusioni di MPI – WakaChewbacca