1

I'm try to use MPI_Scatter, sending rows of matrix(that are dynamically allocated), but it sending only one row, in others are junk. When I use static memory allocation - everything is good.

MPI_Init(&argc, &argv);
int **matrix, *matrix_stor, *row,rank, P;
MPI_Comm_size(MPI_COMM_WORLD, &P);
row = new int [P];
for(int i = 0; i < P; i++)
{
    row[i] = 0;
}
matrix = new int *[P];
for(int i = 0; i < P; i ++)
    matrix[i] = new int [P];

//int matrix[4][4], row[4], rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if (rank == 0){
    for(int i = 0; i < P; i++){
        for(int j = 0; j < P; j++){
            matrix[i][j] = rand()%20;
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
}
cout << endl;

MPI_Scatter(&matrix[0][0], P, MPI_INT,&row[0], P, MPI_INT,0,MPI_COMM_WORLD);
for(int i = 0; i < P; i++)
    cout << row[i] << " ";
cout << endl;
free(matrix);
free(row);
MPI_Finalize();
return 0;

And result is:
Source matrix:
1 7 14 0
9 4 18 18
2 4 5 5
1 7 1 11
Received rows:
1 7 14 0
3626672 3626800 0 0
16 1 119 -33686019
-33686019 -572662307 524296 786765

4

1 に答える 1

3

これはMPIの問題ではなく、Cおよび多次元配列の問題です。

問題は、Cでは、割り当てられた行列が実際にP*P連続しているという保証がないことですintP*Pしたがって、 intを分散させようとするとmatrix[0][0]、誰が何を送信しているのかがわかります。

このコード:

matrix = new int *[P];
for(int i = 0; i < P; i ++)
    matrix[i] = new int [P];

最初にポインタの配列をPintに割り当て、次にそれぞれをintが割り当てられたポインタに設定しPます。matrix[1]しかし、どこから始まるのかという保証はまったくありませんmatrix[0]。これを実行したい場合(MPIの場合も、通常はテクニカルコンピューティングアプリケーションのマルチdアレイの場合も)、連続したメモリブロックを手動で割り当てて、matrixポイントを指定する必要があります。

matrix = new int *[P];
int *data = new int [P*P];
for(int i = 0; i < P; i ++)
    matrix[i] = &(data[P*i]);

そして、スキャッターが機能するはずです。

で割り当てられたメモリの割り当てを解除するには、deleteではなく、を使用する必要があることにも注意してください。free()new

于 2012-10-14T15:12:37.063 に答える