当所有等级都可以看到将要广播的数据时,使用 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_SendMPI_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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...