MPI_ALLGATHER和MPI_Alltoall功能之间的区别?(Difference betw

2019-07-20 10:37发布

betweeen在MPI的MPI_ALLGATHER和MPI_Alltoall功能的主要区别是什么?

我的意思是可以有一个人给我的例子,其中MPI_ALLGATHER将是有益的,MPI_Alltoall不会呢? 反之亦然。

我无法理解的主要区别? 它看起来像在两种情况下的所有进程发送send_cnt要素参与沟通所有其它进程,并接受他们吗?

谢谢

Answer 1:

一张图片说,超过一千字,所以这里有几个ASCII艺术照片:

rank    send buf                        recv buf
----    --------                        --------
 0      a,b,c         MPI_Allgather     a,b,c,A,B,C,#,@,%
 1      A,B,C        ---------------->  a,b,c,A,B,C,#,@,%
 2      #,@,%                           a,b,c,A,B,C,#,@,%

这仅仅是常规MPI_Gather ,只有在这种情况下,所有进程接收数据块,即操作根少。

rank    send buf                        recv buf
----    --------                        --------
 0      a,b,c          MPI_Alltoall     a,A,#
 1      A,B,C        ---------------->  b,B,@
 2      #,@,%                           c,C,%

(a more elaborate case with two elements per process)

rank    send buf                        recv buf
----    --------                        --------
 0      a,b,c,d,e,f    MPI_Alltoall     a,b,A,B,#,@
 1      A,B,C,D,E,F  ---------------->  c,d,C,D,%,$
 2      #,@,%,$,&,*                     e,f,E,F,&,*

(如果每个元素被发送,但...排名有色看起来更好)

MPI_Alltoall工作原理结合MPI_ScatterMPI_Gather -在每个过程中的发送缓冲器在拆分等MPI_Scatter然后块中的每一列由相应的过程,其秩的块列的数目相匹配聚集。 MPI_Alltoall也可以看作是一个全球性的换位操作,作用于数据块。

有没有在这两个操作是可以互换的情况下? 要正确地回答这个问题,就必须简单地分析数据的大小在发送缓冲区和接收缓冲区中的数据:

operation      send buf size      recv buf size
---------      -------------      -------------
MPI_Allgather  sendcnt            n_procs * sendcnt
MPI_Alltoall   n_procs * sendcnt  n_procs * sendcnt

接收缓冲器大小实际上是n_procs * recvcnt ,但发送应等于基本元件的数量基本元件的数目接收的,因此,如果相同的MPI数据类型用于在发送和接收的部件MPI任务MPI_All... ,然后recvcnt必须等于sendcnt

它是立即明显的是,对于所接收的数据的大小相同,由每个过程中发送的数据量是不同的。 对于两种操作是相等的,一个必要的条件是,发送缓冲器的在两种情况下,大小相等,即n_procs * sendcnt == sendcnt ,这是唯一可能的,如果n_procs == 1 ,即,如果仅存在一个过程,或者如果sendcnt == 0 ,即没有数据在所有被发送。 因此,不存在其中两个操作是真的互换实际可行的情况下。 但可以模拟MPI_AllgatherMPI_Alltoall通过重复n_procs在发送缓冲区倍相同的数据(如已经由泰勒吉尔说明)。 这里的作用MPI_Allgather一个元素发送缓冲区:

rank    send buf                        recv buf
----    --------                        --------
 0      a             MPI_Allgather     a,A,#
 1      A            ---------------->  a,A,#
 2      #                               a,A,#

在这里,同样有实现MPI_Alltoall

rank    send buf                        recv buf
----    --------                        --------
 0      a,a,a          MPI_Alltoall     a,A,#
 1      A,A,A        ---------------->  a,A,#
 2      #,#,#                           a,A,#

反向是不可能的-一个不能模拟的作用MPI_AlltoallMPI_Allgather在一般情况下。



Answer 2:

这两张截图有一个快速的解释:

MPI_Allgatherv

MPI_Alltoallv

虽然这MPI_Allgatherv和MPI_Alltoallv,但它之间的比较也说明MPI_ALLGATHER从MPI_Alltoall的区别。



Answer 3:

虽然这两种方法确实非常相似,似乎有他们俩之间的一个重要区别。

MPI_ALLGATHER与具有其接收缓冲器中的完全一样的数据中的每个过程结束时,并且每一个过程仅提供了一个值,以整个阵列。 例如,如果每个一组分享他们与其他人状态的一些单个值所需的流程,每个将提供他们的单个值。 然后,这些值将被发送给大家,让每个人都具有相同的结构的副本。

MPI_Alltoall不发送相同的价值观相互的过程。 代替设置应与彼此进程共享一个单一的值,每个过程指定一个值,得到彼此过程。 换句话说,具有n个进程,每个必须指定n个值共享。 然后,对于每个处理器Ĵ,其第k个值将被发送到处理在接收缓冲区K公司的第j个索引。 如果每个进程具有用于彼此处理一个单一的,独特的消息,这是有用的。

最后一点,运行allgather和alltoall的结果会在每个过程充满了发送缓冲区具有相同值的情况相同。 唯一的区别将是allgather很可能会更有效。



文章来源: Difference between MPI_Allgather and MPI_Alltoall functions?
标签: mpi