私はOpenMPIを学んでいます。簡単な例を試しましたMPI_Scatter
:
#include <mpi.h>
using namespace std;
int main() {
int numProcs, rank;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int* data;
int num;
data = new int[5];
data[0] = 0;
data[1] = 1;
data[2] = 2;
data[3] = 3;
data[4] = 4;
MPI_Scatter(data, 5, MPI_INT, &num, 5, MPI_INT, 0, MPI_COMM_WORLD);
cout << rank << " recieved " << num << endl;
MPI_Finalize();
return 0;
}
しかし、期待通りにはいかなかった...
私は何かを期待していた
0 received 0
1 received 1
2 received 2 ...
しかし、私が得たのは
32609 received
1761637486 received
1 received
33 received
1601007716 received
奇妙なランクとは何ですか?私のスキャッターと何か関係があるようですか?また、なぜsendcount
とrecvcount
が同じなのですか? 最初は、5 つの要素を 5 つのプロセッサに分散させているので、それぞれが 1 になるのではないかと考えました。だから私は使用する必要があります:
MPI_Scatter(data, 5, MPI_INT, &num, 1, MPI_INT, 0, MPI_COMM_WORLD);
しかし、これはエラーになります:
[JM:2861] *** An error occurred in MPI_Scatter
[JM:2861] *** on communicator MPI_COMM_WORLD
[JM:2861] *** MPI_ERR_TRUNCATE: message truncated
[JM:2861] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort
しかし、ルートプロセスと子プロセスを区別する必要があるのはなぜですか? この場合、ソース/ルートもコピーを取得しますか? もう 1 つのことは、他のプロセスも分散して実行されるかどうかです。おそらくそうではありませんが、なぜですか?MPIプログラムで見た場合、典型的ではないので、すべてのプロセスがこのコードを実行すると思いましたか?
if (rank == xxx) {
アップデート
実行することに気付きました。送信バッファと受信バッファは同じ長さでなければなりません...そしてデータは次のように宣言する必要があります:
int data[5][5] = { {0}, {5}, {10}, {3}, {4} };
列の長さは 5 として宣言されていますが、1 つの値しか初期化していないことに注意してください。ここで実際に何が起こっているのですか?このコードは正しいですか? 各プロセスが 1 つの値のみを受け取るようにしたいとします。