betweeen在MPI的MPI_ALLGATHER和MPI_Alltoall功能的主要区别是什么?
我的意思是可以有一个人给我的例子,其中MPI_ALLGATHER将是有益的,MPI_Alltoall不会呢? 反之亦然。
我无法理解的主要区别? 它看起来像在两种情况下的所有进程发送send_cnt要素参与沟通所有其它进程,并接受他们吗?
谢谢
betweeen在MPI的MPI_ALLGATHER和MPI_Alltoall功能的主要区别是什么?
我的意思是可以有一个人给我的例子,其中MPI_ALLGATHER将是有益的,MPI_Alltoall不会呢? 反之亦然。
我无法理解的主要区别? 它看起来像在两种情况下的所有进程发送send_cnt要素参与沟通所有其它进程,并接受他们吗?
谢谢
一张图片说,超过一千字,所以这里有几个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_Scatter
和MPI_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_Allgather
与MPI_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_Alltoall
与MPI_Allgather
在一般情况下。
这两张截图有一个快速的解释:
MPI_Allgatherv
MPI_Alltoallv
虽然这MPI_Allgatherv和MPI_Alltoallv,但它之间的比较也说明MPI_ALLGATHER从MPI_Alltoall的区别。
虽然这两种方法确实非常相似,似乎有他们俩之间的一个重要区别。
MPI_ALLGATHER与具有其接收缓冲器中的完全一样的数据中的每个过程结束时,并且每一个过程仅提供了一个值,以整个阵列。 例如,如果每个一组分享他们与其他人状态的一些单个值所需的流程,每个将提供他们的单个值。 然后,这些值将被发送给大家,让每个人都具有相同的结构的副本。
MPI_Alltoall不发送相同的价值观相互的过程。 代替设置应与彼此进程共享一个单一的值,每个过程指定一个值,得到彼此过程。 换句话说,具有n个进程,每个必须指定n个值共享。 然后,对于每个处理器Ĵ,其第k个值将被发送到处理在接收缓冲区K公司的第j个索引。 如果每个进程具有用于彼此处理一个单一的,独特的消息,这是有用的。
最后一点,运行allgather和alltoall的结果会在每个过程充满了发送缓冲区具有相同值的情况相同。 唯一的区别将是allgather很可能会更有效。