- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
,只有在这种情况下所有进程都会收到数据 block ,即操作是无根的。
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
然后每一列的 block 由各自的进程收集,其等级与 block 列的编号匹配。 MPI_Alltoall
也可以看作是全局转置操作,作用于数据 block 。
这两种操作是否存在可以互换的情况?要正确回答这个问题,只需简单分析一下发送缓冲区和接收缓冲区的数据大小:
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_All...
的发送和接收部分使用相同的 MPI 数据类型,然后recvcnt
必须等于sendcnt
.
很明显,对于相同大小的接收数据,每个进程发送的数据量是不同的。为了使两个操作相等,一个必要条件是两种情况下发送的缓冲区的大小相等,即 n_procs * sendcnt == sendcnt
,只有在 n_procs == 1
时才有可能,即如果只有一个进程,或者如果 sendcnt == 0
,即根本没有发送任何数据。因此,实际上不存在两种操作真正可以互换的可行情况。但可以模拟MPI_Allgather
与 MPI_Alltoall
通过重复n_procs
乘以发送缓冲区中的相同数据(正如 Tyler Gill 已经指出的那样)。这是 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
的 Action 与 MPI_Allgather
在一般情况下。
关于mpi - MPI_Allgather 和 MPI_Alltoall 函数之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049190/
我在一个大型软件的一部分中遇到了 MPI_Allgather 问题。 以下函数传递每个节点上不同的 double 和相关标志,然后该函数应该找到全局最小 double ,并将所有节点设置为相应的值。
根据评论编辑 我正在学习 MPI,我正在做一些练习以了解它的某些方面。我编写了一个应该执行简单蒙特卡洛的代码。 其中有两个必须完成的主要循环:一个关于时间步长 T 和一个更小的关于分子数量 N 的循环
我首先在每个处理器上生成一个随机数。在第二步中,我想将生成的数字发送到其他所有处理器。也就是说,在使用 MPI_Allgather 之后,每个处理器都拥有一个包含所有生成的随机数的列表: #inclu
经过大量谷歌搜索,我不知道是什么导致了这个问题。在这里: 我在我的代码中有一个对 MPI_Allgather 的简单调用,我对它进行了双重、三次和四次检查以确保正确(发送/接收缓冲区大小合适;调用中的
我在用 C 编写并行分子动力学算法时遇到了一个问题,其中所有核心计算最小碰撞时间,然后通过 MPI_Allgather 将碰撞伙伴与所有其他核心通信,以查看哪个碰撞最早。我内置了一个时间测量函数来查看
我必须使用 MPI_Allgather() 向所有进程发送一个结构。我似乎没有收到任何明显的错误,但是代码不起作用。当我检查我是否在 recv[] 中收到任何值时,它显示没有。如果我只发送一个变量而不
我有一个程序,其目的是将特定数据添加到一个主数组中。随机数测试 passesTest(randomNumber) 每秒执行数百万次,并且极少数情况下测试会通过并且随机数被推送到数组的末尾。因此,大多数
#include #include #include #include #include #define h 1 #define XY0 0 #define MAX_XY 5 #define
您好,我希望找到所有进程的局部最大值,然后将所有局部最大值传递给所有进程以形成单个数组,然后使用 MPI 环形拓扑比较局部最大值,最后输出全局最大值。 我可以更有效地执行 MPI_ALLreduce
MPI_Allgather()有什么区别和 MPI_Allgatherv() ? 最佳答案 来自 MPI standard MPI_GATHERV extends the functionality
MPI 中的 MPI_Allgather 和 MPI_Alltoall 函数之间的主要区别是什么? 我的意思是有人可以给我举例说明 MPI_Allgather 有帮助而 MPI_Alltoall 没有
我正在尝试计算一些基于其先前位置的物体的位置。因此,在每个 k 循环中,我需要使用计算并存储在 Cw 数组中的物体的新坐标 (x,y,z) 来更新每个 C 数组。我尝试了 MPI_Allgather
在MPI中,是否可以在不分配缓冲区的情况下立即丢弃接收到的数据?我正在使用 MPI_Allgather 从多个进程收集数据,但在某个时刻,一个或多个进程没有要发送的有用数据。 我最初的解决方案是让无用
我有一个带有mpi和MPI_Allgather和MPI_pack的problem。 我有结构: typedef struct{ float a; int b; int c[];
我正在使用 MPI-2 编写一个优化程序,其中我需要一个等长的 std::vector 的 std::vector(概念上) ,在所有进程之间共享。此 vector 包含针对当前发现的问题的最佳 k
我是一名优秀的程序员,十分优秀!