当所有等级都可以看到将要广播的数据时,使用 MPI_Bcast 有什么意义?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?