0

For hours im trying to send 2D array over MPI to diffrent thread. Code looks like this (i'll leave comments to show tricks that i have already tryed):

Type definition:

// Define datatype
//MPI_Type_contiguous(N, MPI_INT, &mpi_vector);
//MPI_Type_vector(N, N, N, mpi_vector, &mpi_matrix);
//MPI_Type_vector(N, N, N, MPI_INT, &mpi_matrix);
//MPI_Type_contiguous(N, MPI_INTEGER, &mpi_vector);
//MPI_Type_contiguous(N, mpi_vector, &mpi_matrix);
MPI_Type_vector(N, N, 0, MPI_INTEGER, &mpi_matrix);
//MPI_Type_commit(&mpi_vector);
MPI_Type_commit(&mpi_matrix);

Sending and recieving:

int** tmp = new int*[N];
switch(r) {
case T1:
    inputMatrix(tmp, 2);
    MPI_Send(tmp, 1, mpi_matrix, T2, 0, MPI_COMM_WORLD);
    //task_T1();
    break;
case T2:
    //task_T2();
    inputMatrix(tmp, -1);
    MPI_Recv(tmp, 1, mpi_matrix, T1, 0, MPI_COMM_WORLD, &s);
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++) {
            cout << "  " << tmp[i][j];
        }
        cout << endl;
    }
    break;
}

I need to have this done till morning (in 7 hours), i hope smb is able to help me.

4

1 に答える 1

6

MPIは、各行が個別に割り当てられているマトリックス (行へのポインターの配列) をサポートしていません。MPIは、行がメモリに連続して格納されるフラットな配列でのみ機能します。フラット配列を使用します。

int** tmp = ...

なるべき

int* tmp = new int[rows*cols];

tmp[row][col]としてアクセスする必要がありますtmp[row*cols + col]

1 つの行から連続MPI_INT型を構築し、行列全体の前の連続型から連続型を構築できます。単一の連続したタイプのrows*cols MPI_INT要素を構築することもできます。最初のアプローチは、後で個々の行を送信する必要がある場合があるため、より柔軟です。

于 2012-05-30T21:39:41.587 に答える