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
This isn’t an MPI issue, it’s a C and multidimensional arrays issue.
The problem is that in C there’s no guarantee that your allocated matrix is actually
P*Pcontiguousints. So when you try to scatterP*Pints starting atmatrix[0][0], who knows what you’re sending out.This code:
Allocates first an array of
Ppointers-to-int, and then sets each one to a pointer where has been allocatedPints. But there’s no guarantee at all thatmatrix[1]starts wherematrix[0]ends. If you want to do this – and you do, both for MPI and normally for multi-d arrays in technical computing applications generally – you have to manually allocate the contiguous block of memory and havematrixpoint into it:And then the scatter should work.
Note too that you should be using
delete, notfree(), to deallocate memory allocated withnew.