1

ランク=0のプロセスから他のすべてのプロセス(1、2、3、4)にベクトルからの値を送信しようとしていますn_pointsBuffer。問題は、プロセス0だけがその値を取得し、他のプロセスは取得しないことです。私がやろうとしていることが可能かどうか誰かが私に説明できますか?もしそうなら、どのように?MPIを使うのは初めてです。

#include <mpi.h>
#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

int main(int argc, char* argv[]) {

MPI::Init(argc, argv);

int num_procs = MPI::COMM_WORLD.Get_size();
int rank = MPI::COMM_WORLD.Get_rank();

srand(getpid());
int n_points;

if (rank == 0) {
    int n_pointsBuffer[] = { 1000000, 1203100, 1231230, 1231000, 1312322 };
    MPI::COMM_WORLD.Scatter(n_pointsBuffer, 1, MPI::INT, &n_points, 1,
            MPI::INT, 0);
}

cout << "Rank = " << rank << ", n_points = " << n_points << "\n";

double sum = 0;

for (int i = 0; i < n_points; i++) {
    double x = rand() / ((double) (RAND_MAX));
    double f = 1.0 / (1.0 + x * x);
    sum += f;
}

double avg_sum = 0;
MPI::COMM_WORLD.Reduce(&sum, &avg_sum, 1, MPI::DOUBLE, MPI::SUM, 0);

if (rank == 0) {
    double pi = 4.0 * (avg_sum / num_procs / ((double) (n_points)));
    cout << "Pi is approx " << pi << " with error " << pi - M_PI << ".\n";
}

MPI::Finalize();

return 0;
}
4

1 に答える 1

6

これは、誰もがを呼び出さなければならないためですScatter()。ルートだけではありません。別の回答からの引用:

MPI_Scatter関数には、送信ロジックと受信ロジックの両方が含まれています。ルートプロセス(ここでは0として指定)がデータを送信し、すべての受信者が受信します。参加するすべての人がルーチンを呼び出す必要があります。Scatterは、コミュニケーター内のすべてのタスクが同じルーチンを呼び出す必要があるMPICollectiveOperationの例です。ブロードキャスト、バリア、リダクション操作、および収集操作は他の例です。

すべての集合操作についても同じことが当てはまることに注意してください。Broadcastの使用例はここにあります(同じリポジトリ内に他のプログラムもいくつかあります。これらは、ダンプされたマシンで作成されたMPIクラスターをテストするために私が作成したものです)。

于 2012-12-04T09:53:32.380 に答える