如何解决当所有等级都可以看到将要广播的数据时,使用 MPI_Bcast 有什么意义?
我只是在考虑使用 MPI_Bcast
背后的原因,因为当我不向所有等级广播整数 N 时,他们可以看到 N。查看代码及其结果。在广播之前和之后,整数 N 对所有等级都是可见的。那么,这有什么意义呢?
此外,使用 MPI_Bcast
更改调用每个等级的顺序是否有意义?
#include <iostream>
#include "mpi.h"
using namespace std;
int main()
{
MPI_Init(NULL,NULL);
int rank,size;
int N=9 ;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
cout << " Hello from rank : " << rank << " N is: " << N << endl;
MPI_Bcast(&N,1,MPI_INT,MPI_COMM_WORLD);
cout << " Hello from rank : " << rank << " N is: " <<N<<endl;
MPI_Finalize();
}
结果:
Hello from rank : 1 N is: 9
Hello from rank : 3 N is: 9
Hello from rank : 0 N is: 9
Hello from rank : 2 N is: 9
Hello from rank : 0 N is: 9
Hello from rank : 1 N is: 9
Hello from rank : 2 N is: 9
Hello from rank : 3 N is: 9
解决方法
MPI_Bcast
在您的示例中的 N
实际上会被广播等级更改的情况下很有用。考虑一下:
#include <iostream>
#include "mpi.h"
using namespace std;
int main()
{
MPI_Init(NULL,NULL);
int rank,size;
int N=9 ;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
cout << " Hello from rank : " << rank << " N is: " << N << endl;
// Change N on the rank that will broadcast
if (rank == 0) {
N = 18;
}
MPI_Bcast(&N,1,MPI_INT,MPI_COMM_WORLD);
cout << " Hello from rank : " << rank << " N is: " <<N<<endl;
MPI_Finalize();
}
Rank 0 更改了 N
并希望将其自己的值发送到所有其他 rank。它可以使用 MPI_Send
和 MPI_Recv
单独将其发送到每个级别,也可以使用某种形式的集体通信,例如 MPI_Bcast
。
MPI_Bcast
是正确的选择,因为它针对它提供的功能进行了优化:从一个人向所有人发送信息。我建议您查看其通信算法以了解。
由于通信是CPU并行化的瓶颈,所以要慎重选择通信算法。经验法则是,无论是为集体通信而设计的任何内容,都应该用于这种情况,而不是点对点的发送-接收方法(即 0 级单独发送给彼此)。
一对多广播其实在实践中是很常见的情况,至少在科学计算中是这样的,比如一个rank需要读取输入参数,准备模拟的理由,然后广播一些必要的信息给所有其他等级。在计算过程中也可能需要广播,其中一个等级需要与其他等级或所有等级的子集共享其结果。
,在您的示例中,该值是硬编码的。广播一个已知的值是没有意义的。
如果它是在启动后以排名 0 计算的呢?然后可以使用 MPI_Bcast
将其广播到所有其他等级。
MPI_Init(NULL,size;
int N = 0;
MPI_Comm_rank(MPI_COMM_WORLD,&size);
cout << " Hello from rank : " << rank << " N is: " << N << endl;
if (rank == 0) {
N = 9;
}
MPI_Bcast(&N,MPI_COMM_WORLD);
cout << " Hello from rank : " << rank << " N is: " <<N<<endl;
MPI_Finalize();
打印:
Hello from rank : 0 N is: 0
Hello from rank : 3 N is: 0
Hello from rank : 2 N is: 0
Hello from rank : 1 N is: 0
Hello from rank : 0 N is: 9
Hello from rank : 1 N is: 9
Hello from rank : 2 N is: 9
Hello from rank : 3 N is: 9
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。