【问题标题】:Receiving with MPI_Type_vector in C在 C 中使用 MPI_Type_vector 接收
【发布时间】:2012-11-22 23:06:58
【问题描述】:

我有一个静态分配的二维数组 NxN,我想发送ith 列(带有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;
}

为什么第一种模式返回正确:

1 5 9 13

第二个返回不正确?

1  -2  1980804601  1980804675

【问题讨论】:

标签: c multidimensional-array parallel-processing mpi


【解决方案1】:

MPI 数据类型描述了数据的布局和数据量。例如,1 个列类型的计数描述了 N 个整数,但 N MPI_INTs 的计数也是如此。不同之处在于您的列类型(正确)描述了在大小为 NxN 的数组中跳转以提取列。使用该类型发送会提取 N 个 int,并将它们捆绑到一条消息中。

因此,当您发送时,您发送一种列类型来发送特定的 N 个整数,这些整数在您的数组中形成一列。但是到了接收的时候,虽然你仍然想接收 N 个整数,但是你将它接收到一个连续的一维整数数组(你的 col[] 数组)中,所以你只想接收 N MPI_INTs。如果您接收到列数据类型,您仍然会收到 N 个整数,但它们将被放入间隔 N 个整数的内存中(实际上,如果 N 足够大,您会得到一个段错误,因为您在外面写得很好你的 col 数组的边界)。这就是为什么当您收到一个列类型时,只有第一个数字是正确的;其余的都是垃圾,因为数组的其余部分仍未初始化。您的第二条数据 5 将被写入 col 数组的末尾。

【讨论】:

  • 谢谢乔哈坦!现在,我尝试对这个论点进行一些练习。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多