Fed*_*nca 4 c parallel-processing mpi multidimensional-array
我有一个静态分配的2D数组NxN,我想发送第一i列(带i = 0 ... N-1).
我写:
int main(int argc, char **argv) {
int myrank, nprocs;
int i,j;
int matrix[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int col[N];
...
// Define type "column"
MPI_Datatype column;
MPI_Type_vector(N,1,N,MPI_INT,&column);
MPI_Type_commit(&column);
if(myrank==0){
j=0;
MPI_Send(&matrix[0][j],1,column,1,99,MPI_COMM_WORLD);
}
if(myrank==1){
// **** FIRST MODE: Don't use "column" type *****
MPI_Recv(col,N,MPI_INT,0,99,MPI_COMM_WORLD,&info);
// **** SECOND MODE: Use "column" type *****
// MPI_Recv(col,1,column_INT,0,99,MPI_COMM_WORLD,&info);
printf("\nColumn: ");
for(j=0;j<N;j++)
printf("\n %d",col[j]);
}
MPI_Type_free(&column);
MPI_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个模式正确返回:
1 5 9 13
Run Code Online (Sandbox Code Playgroud)
而第二次回报错误?
1 -2 1980804601 1980804675
Run Code Online (Sandbox Code Playgroud)
MPI数据类型描述了数据的布局和数据的大小.因此,例如,一个列类型的计数描述N个int,但N MPI_INT的计数也是如此.不同之处在于您的列类型(正确)描述了在大小为NxN的数组中跳转以提取列.使用该类型发送提取N个int,并将它们捆绑到一条消息中.
因此,当您发送时,您发送其中一种列类型以发送特定的N个整数,这些整数在您的数组中形成一列.但是当它接收的时候,你仍然希望接收N个int,但是你将它接收到一个连续的1d整数col[]数组(你的数组),所以你只想接收N MPI_INTs.如果你接收到一个列数据类型,你仍然会收到N个整数,但是它们将被分成N个间隔的内存(实际上,如果N足够大,你会得到一个段错误,因为你在外面写得很好你的col数组的边界).这就是为什么当你收到列类型时,只有第一个数字是正确的; 其余的都是垃圾,因为阵列的其余部分仍未初始化.你的第二段数据5将在你的col数组的末尾写完.