これまでのところ、私のアプリケーションは整数のリストを持つtxtファイルを読み込んでいます。これらの整数は、マスタプロセス、つまりランク0のプロセッサによって配列に格納される必要があります。これは正常に動作しています。CからMPI_ScatterとMPI_Gatherはどのように使用されますか?
私はプログラムを実行するときに、それがマスタプロセスかどうかをチェックするif文を持っています。もしそうなら、私はMPI_Scatter
コマンドを実行しています。
私が理解するところでは、これは配列を数値で細分し、それをスレーブプロセス、つまりrank> 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;
}
何優れた答え
は、だからここに(集まる含めるを更新)簡単な例です。それは非常にまっすぐ進むようになり、私はそれが今どのように動作するかを見ます。私はそれを集合的な操作として考えていない間違いをしました。 ありがとう! – DSF
うわー!あなたは私の日を救った、乾杯。ありがとうございました – irobo
ほとんどのMPIイントロ – WakaChewbacca