📄 mpi47.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>第四章: 集合通信</TITLE>
<META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (Win16; I) [Netscape]">
</HEAD>
<BODY BGCOLOR="#F0F8FF">
<TABLE WIDTH="100%" >
<TR>
<TD align=left><B><FONT SIZE=+1>4.7 收集到全局(Gather-to-all)</FONT></B></TD>
<TD align=right><A HREF="mpi46.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi46.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A><A HREF="mpi48.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi48.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>
<P>
<HR WIDTH="100%"></P>
<PRE>MPI_ALLGATHER(sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype,comm)
IN sendbuf 发送消息缓冲区的起始地址(可变)
IN sendcount 发送消息缓冲区中的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可变)
IN recvcount 从任一进程中接收的元素个数(整型)
IN recvtype 接收消息缓冲区的数据类型(句柄)
IN comm 通信子(句柄)
int MPI_Allgather(void* sendbuf, int sendcount, MPI_Datatype sendtype,
void* recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm)
MPI_ALLGATHER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT,
RECVTYPE, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR</PRE>
<P>MPI_ALLGATHER和MPI_GATHER意义相同,但此时是所有进程都将接收结果,而不是只有根进程接收结果.从每个进程发送的第j块数据将被每个进程接收,然后存放在各个进程接收消息缓冲区recvbuf的第j块.</P>
<P>每一个进程的sendcount和sendtype的类型必须和其他所有进程的recvcount和recvtype相同.</P>
<P>调用MPI_ALLGATHER相当于所有进程执行了n次调用:</P>
<PRE> MPI_GATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,
root,comm),</PRE>
<P>其中root从0到n-1.有关于MPI_ALLGATHER的正确使用方法和MPI_GATHER相同.</P>
<PRE>MPI_ALLGATHERV(sendbuf, sendcount, sendtype, recvbuf, recvcounts,
displs,recvtype,comm)
IN sendbuf 发送消息缓冲区的起始地址(可变)
IN sendcount 发送消息缓冲区中的数据个数(整型)
IN sendtype 发送消息缓冲区中的数据类型(句柄)
OUT recvbuf 接收消息缓冲区的起始地址(可变)
IN recvcounts 整型数组(长度为组的大小), 存放着每个进程中接收的数
据个数(整型)
IN displs 整数数组(长度为组的大小),每个入口i存放着相对于
recvbuf的位移,此位移处存放着从进程i中接收的输入数据
IN recvtype 接收消息缓冲区的数据类型(句柄)
IN comm 通信子(句柄)
int MPI_Allgatherv(void* sendbuf, int sendcount,MPI_Datatype sendtype,
void* recvbuf, int *recvcounts, int *displs,
MPI_Datatype recvtype, MPI_Comm comm)
MPI_ALLGATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS,
DISPLS, RECVTYPE, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE,
COMM, IERROR</PRE>
<P>MPI_ALLGATHERV和MPI_GATHERV意义相同,但此时是所有的进程都将接收结果,而
不是只有根进程接收结果.从每个进程发送的第j块数据将被每个进程接收,然后存放在各个进程接收消息缓冲区recvbuf的第j块.这些块的大小不必相同.</P>
<P>进程j的sendcount和sendtype的类型必须和其他所有进程的recvcounts[j]和recvtype相同.</P>
<P>调用MPI_ALLGATHERV相当于所有进程执行了:</P>
<PRE> MPI_GATHERV(sendbuf,sendcount,sendtype,recvbuf,recvcounts,displs,
recvtype,root,comm),</PRE>
<P>其中root从0到n-1.有关于MPI_ALLGATHERV的正确使用方法和MPI_GATHERV相同.</P>
<P><A NAME="section1"></A><B><FONT SIZE=+1>4.7.1 应用MPI_ALLGATHER和MPI_ALLGATHERV的例子</FONT></B></P>
<P>例4.14: 用收集到全局的方法对例4.2进行改造,即用MPI_ALLGATHER从组内的每个进程收集100个数据然后送到每个进程中.</P>
<PRE> MPI_Comm comm;
int gsize,sendarray[100];
int *rbuf;
......
MPI_Comm_size(comm, &gsize);
rbuf = (int *)malloc(gsize*100*sizeof(int));
MPI_Allgather(sendarray, 100, MPI_INT, rbuf, 100, MPI_INT, comm);</PRE>
<P>调用结束后,每个进程都将得到全局范围内的数据并将其依次存放在自身的缓冲区中.</P>
<P>
<HR WIDTH="100%"></P>
<TABLE WIDTH="100%" >
<TR>
<TD align=left>Copyright: NPACT </TD>
<TD align=right><A HREF="mpi46.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi46.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A><A HREF="mpi48.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi48.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -