これまでのところ、私のアプリケーションは整数のリストを含む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;
}