Пока мое приложение читает в txt файле со списком целых чисел. Эти целые числа должны храниться в массиве с помощью главного процесса, то есть процессора с рангом 0. Это работает нормально.
Теперь, когда я запускаю программу, у меня есть оператор if, проверяющий, является ли это главным процессом, и если это так, я выполняю команду MPI_Scatter
.
Из того, что я понимаю, это разделит массив на числа и передаст его подчиненным процессам, то есть всем с рангами > 0. Однако я не уверен, как обращаться с MPI_Scatter
. Как подчиненный процесс "подписаться" для получения подматрицы? Как я могу сказать, что не-мастер-процессы что-то делают с подматрицей?
Может ли кто-нибудь предоставить простой пример, чтобы показать мне, как мастер-процесс отправляет элементы из массива, а затем подчиненные добавляют сумму и возвращают это мастеру, который суммирует все суммы и распечатывает их?
Мой код:
#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;
}