考虑下面引用的函数MPI_Gather
的{{3}}。它采用参数sendtype
和recvtype
什么时候不通过相同类型是有意义的,例如两者都是MPI_FLOAT
或MPI_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)
答案 0 :(得分:2)
MPI只需要匹配签名。
例如,你可以发送10 MPI_INT
并获得1个派生数据类型,它是10 MPI_INT
的向量。
答案 1 :(得分:0)
为了完整起见,我也引用了吉尔斯的回答。
MPI只需要匹配签名。
例如,您可以发送10
MPI_INT
并获得1个派生数据类型 这是10MPI_INT
的向量。
Gilles Gouaillardet's answer包含一个非常有用的关于“派生数据类型”的评论,它引导我this explanation by Victor Eijkhout at the Texas Advanced Computing Center。
矢量类型描述了一系列块,所有块都是相等大小的间隔 不断迈步。 [...] vector数据类型给出了第一个 数据类型在发件人上可能有所不同的重要说明 和接收者。如果发送方发送每个长度为l的b块,则 接收器可以接收它们作为b * l连续元素,或者作为a 连续的数据类型,或作为基本类型的连续缓冲区; 看图。在这种情况下,接收器不知道 发送方的数据类型的步幅。
[...]在此示例中,仅在发件人中创建矢量类型 为了发送一个数组的跨步子集;接收器接收 数据作为一个连续的块。
作为此数据类型的示例,请考虑转置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替换索引表达式。