打开MPI广播延迟测量

时间:2013-08-28 19:37:39

标签: c++ boost mpi openmpi boost-mpi

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

即。

int64_t t1 = Utility::picosecondTime(); //exactly what it sounds like; utility that measures current time in picoseconds
boost::mpi::broadcast(communicator, variable, 0);
std::cout << "Broadcast took " << Utility::picosecondTime()-t1 << std::endl;

或直接OpenMPI:

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;

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您误以为阻止全局同步调用。唯一保证全局同步的集体MPI操作是MPI_BARRIER - 除非所有进程都调用它,否则它将无法完成。一旦进行呼叫的进程不需要进一步参与,MPI就允许其他集体呼叫返回。

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

  • 基本线性 - 这个使用一堆MPI_ISEND s后跟MPI_WAITALL,因此只有在所有发送完成且信息已达到所有其他等级后才会完成;
  • 二进制/二叉树 - 一旦消息被传输到作为根节点的直接后代的行中,这个就完成了;它仍然需要更多时间来到达树中的所有节点;
  • 管道 - 这一段对消息进行分段并实现一个管道,将管段从根级别移交给它后面的下一个,然后将它们交给下一个,依此类推;使用大型消息和非常快速的网络(例如InfiniBand)完成root中的操作意味着全局完成几乎迫在眉睫;
  • chain - 这个将进程分成几个组,然后为每个组实现一个单独的管道。

您可以强制执行Open MPI要使用的特定算法 - 只需查看coll_tuned_bcast_algorithm MCA参数的可能值以及其他相关参数:

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

衡量MPI_BCAST时间的正确方法是用MPI_BARRIER次呼叫围绕它,但是你还必须正确测量屏障呼叫本身的开销,然后补偿它