传递MPI_Gather的目的是什么?recvtype不等于sendtype?

时间:2018-04-28 11:14:32

标签: mpi mpich

考虑下面引用的函数MPI_Gather的{​​{3}}。它采用参数sendtyperecvtype 什么时候不通过相同类型是有意义的,例如两者都是MPI_FLOATMPI_DOUBLE

我问,因为两次传递相同的参数似乎没用,所以MPI可能有理由同时接受receive-和sendtype。

  

MPI_Gather
  汇集来自一组流程的值

     

概要

int MPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
               void *recvbuf, int recvcount, MPI_Datatype recvtype,
               int root, MPI_Comm comm)
     

输入参数

sendbuf
    starting address of send buffer (choice)
sendcount
    number of elements in send buffer (integer)
sendtype
    data type of send buffer elements (handle)
recvcount
    number of elements for any single receive (integer, significant only at root)
recvtype
    data type of recv buffer elements (significant only at root) (handle)
root
    rank of receiving process (integer)
comm
    communicator (handle)
     

输出参数

recvbuf
     address of receive buffer (choice, significant only at root)

2 个答案:

答案 0 :(得分:2)

MPI只需要匹配签名。

例如,你可以发送10 MPI_INT并获得1个派生数据类型,它是10 MPI_INT的向量。

答案 1 :(得分:0)

为了完整起见,我也引用了吉尔斯的回答。

  

MPI只需要匹配签名。

     

例如,您可以发送10 MPI_INT并获得1个派生数据类型   这是10 MPI_INT的向量。

Gilles Gouaillardet's answer包含一个非常有用的关于“派生数据类型”的评论,它引导我this explanation by Victor Eijkhout at the Texas Advanced Computing Center

  

矢量类型描述了一系列块,所有块都是相等大小的间隔   不断迈步。 [...] vector数据类型给出了第一个   数据类型在发件人上可能有所不同的重要说明   和接收者。如果发送方发送每个长度为l的b块,则   接收器可以接收它们作为b * l连续元素,或者作为a   连续的数据类型,或作为基本类型的连续缓冲区;   看图。在这种情况下,接收器不知道   发送方的数据类型的步幅。 Figure

     

[...]在此示例中,仅在发件人中创建矢量类型   为了发送一个数组的跨步子集;接收器接收   数据作为一个连续的块。

     

作为此数据类型的示例,请考虑转置a的示例   矩阵,例如在C和Fortran数组之间转换[...]   假设一个处理器有一个矩阵存储在C,row-major,layout,   它需要将列发送到另一个处理器。如果矩阵是   声明为int M,N; double mat[M][N],然后一列有M个块   一个元件,间隔N个位置。换句话说:

MPI_Datatype MPI_column;
MPI_Type_vector( 
    /* count= */ M, /* blocklength= */ 1, /* stride= */ N,
    MPI_DOUBLE, &MPI_column );
     

发送第一列很简单:

MPI_Send( mat, 1,MPI_column, ... );
     

第二栏只是有点棘手:你现在需要挑选出来   具有相同步幅的元素,但从A 0开始。

MPI_Send( &(mat[0][1]), 1,MPI_column, ... );
     

你可以通过以下方式提高效率(并且更难阅读)   用mat + 1替换索引表达式。