私は、次を使用して固有行列を使用してMPI_Scatterを実装しようとしています:それから私は、固有マトリックスを散乱してみてくださいMPI_Scatter:散布固有マトリックス
-1 -1 -1 -1
-0.997455 -0.996032 -0.998472 -0.996154
-0.94402 -0.912698 -0.966387 -0.915385
-0.974555 -0.960317 -0.984721 -0.961538
-0.46056 -0.0753968 -0.676089 0.423077
1 1 1 1
:
// get pointer to samples
double *X = prob.x;
// map the samples into the matrix object
MatrixXd globaldata = Map<MatrixXd>(X, dims, nsmp);
MatrixXd localdata;
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
printf("Processor %d has data before Scatter \n", rank);
cout << globaldata<<endl<<endl;
}
MPI_Scatter(globaldata.data(), 1, MPI_DOUBLE, &localdata, 1, MPI_DOUBLE, 0,
MPI_COMM_WORLD);
printf("Processor %d has data \n", rank);
cout << localdata << endl;
MatrixXdグローバルデータの出力をされますグロタルデータ使用
しかし、私は上記が正しいとは思わない。上記の固有行列を列ごとに分散させると、mpirun -np 4 ./mpitest
を実行すると、たとえば、各プロセスにマッピングされた固有行列の各列またはnpが2の場合に各プロセスにマップされる2が表示されます。 send_datatypeとrecv_datatypeはi-e MPI_DOUBLEが正しいですか?
MatrixXdを使用せず、Xだけを使用してもまだ動作しない場合。 Xはサイズ4 * 6の配列です。私は使用しようとしました\t \t MPI_Scatter(&X、4、MPI_DOUBLE、&X1、4、MPI_DOUBLE、0、 \t MPI_COMM_WORLD);ここでもX1はdouble * X1として宣言されています。私はmpirun -np 4 ./testを使って走っています。それは私にセグメンテーションフォールトを与えます。 – srai