2016-04-17 15 views
0

私は、次を使用して固有行列を使用して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が正しいですか?

答えて

2

MPI_Scatterでは、各プロセスに送信された要素の数が1になります。 「サイズ」プロセスの間に行列を均等に分配するには、countを16/size(4x4行列の例の場合)に設定する必要があります。

これは、1つの連続したメモリブロックとして格納されているマトリックスのすべてのデータに依存します。MatrixXdタイプの場合はそれを確認する必要があります。

この場合も、スキャッタが行または列を分散するかどうかは、格納順序によって異なります。標準的なC配列の場合、4つのプロセスでは、列ではなく、各プロセスに別々の行を送ります。しかし、Eigenはカラム・メジャー・ストレージ(Fortranでは標準ですがCでは標準ではありません)にデフォルト設定されているようですが、これはカラム全体を送信していることを意味します。

+0

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

0

受信バッファに領域を割り当てる必要があります。変数をdouble *として定義するだけではストレージが予約されないため、エラーが発生します。私は元の例でも同じことが当てはまると思います - localdataは定義されていますが、ストレージスペースが割り当てられていないようです。

は、コードの作業を取得するには、試みることができる:エラーがMPI_Scatterに発生している

double X1[24]; // This is more storage than you need but its safe 
... 
MPI_Scatter(X, 4,MPI_DOUBLE, X1, 4, MPI_DOUBLE, 0, MPI_COMM_WORLD) 

が、私は、問題の原因は、いくつかの混乱がポインタと割り当てアレイの間ここにありますということだと思います。