C++ 开放MPI广播延迟测量

C++ 开放MPI广播延迟测量,c++,boost,mpi,openmpi,boost-mpi,C++,Boost,Mpi,Openmpi,Boost Mpi,通过阅读文档,MPI_Bcast是一个阻塞调用(因此boost::MPI::broadcast)也是。测量根节点广播所需的时间量是否可以很好地测量数据从根节点到所有其他节点所需的时间 即 int64_t t1=实用工具::皮秒()//确切地说,它听起来像什么;以皮秒为单位测量当前时间的实用程序 boost::mpi::broadcast(通信器,变量,0); std::cout一个MPI_BCAST通常以某种树的方式实现,树顶部的进程可以在完成部分广播后退出算法。因此,如果秩0将消息发送到秩1和

通过阅读文档,MPI_Bcast是一个阻塞调用(因此boost::MPI::broadcast)也是。测量根节点广播所需的时间量是否可以很好地测量数据从根节点到所有其他节点所需的时间

int64_t t1=实用工具::皮秒()//确切地说,它听起来像什么;以皮秒为单位测量当前时间的实用程序
boost::mpi::broadcast(通信器,变量,0);

std::cout一个
MPI_BCAST
通常以某种树的方式实现,树顶部的进程可以在完成部分广播后退出算法。因此,如果秩0将消息发送到秩1和n/2,那么它可以在这些消息完成后离开。所以你问题的答案是:不,这不是一个精确的测量

如果没有精确同步的时钟,很难实际测量整个广播在所有节点上花费的时间。有一些技巧可以让你更接近(在开始计时之前使用
MPI_屏障进行同步,并使用广播中任何进程花费的最长时间),但由于时钟仍有一些漂移,没有什么是完美的。

你把阻塞调用和全局同步调用搞错了。唯一保证全局同步的集体MPI操作是
MPI\u BARRIER
——除非所有进程都调用它,否则它不会完成。MPI允许其他集体调用在发出调用的进程不需要进一步参与时立即返回

MPI\u BCAST
几乎就是后者的一个例子。OpenMPI提供了几种实现,其中包括:基本线性、二叉树、二叉树和管道/链。每个实现都可以进一步细分消息。在运行时使用硬编码的启发式方法根据消息大小和通信器的大小选择一个特定的实现。从根秩的角度来看,根据所使用的算法,相同的广播操作可能需要不同的时间

  • 基本线性-此命令使用一组
    MPI\u ISEND
    s,然后是
    MPI\u WAITALL
    ,因此仅在所有发送完成且信息到达所有其他列后完成
  • 二叉树/二叉树-一旦消息传输到作为根节点直接后代的列组,此树即告完成;它可能仍然需要更多的时间才能到达树中的所有节点
  • 管道-这条管道对消息进行分段,并实现一个管道,将这些段从根列传递到它后面的下一个列,然后再将它们传递到下一个列,以此类推;对于大消息和非常快速的网络(如InfiniBand),在根目录中完成操作意味着全球完成几乎迫在眉睫
  • 链-该方法将流程划分为几个组,然后为每个组实现一个单独的管道
您可以强制执行Open MPI使用的特定算法-只需查看
coll\u tuned\u bcast\u算法
MCA参数和其他相关参数的可能值:

$ ompi_info --mca coll_tuned_use_dynamic_rules 1 --param coll tuned | grep bcast

测量
MPI\u BCAST
的时间的正确方法是用
MPI\u BARRIER
调用将其包围,但您还必须正确测量BARRIER调用本身的开销,然后对其进行补偿。

谢谢,简洁易懂的回答。这个技巧也帮助我们发现了一个我们不知道的节点同步问题。
MPI_Comm comm; 
int array[100]; 
...
int64_t t1 = Utility::picosecondTime(); 
MPI_Bcast( array, 100, MPI_INT, 0, comm); 
std::cout << "Broadcast took " << Utility::picosecondTime()-t1 << std::endl;
$ ompi_info --mca coll_tuned_use_dynamic_rules 1 --param coll tuned | grep bcast