通过阅读文档,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;
答案 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
,因此只有在所有发送完成且信息已达到所有其他等级后才会完成; 您可以强制执行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
次呼叫围绕它,但是你还必须正确测量屏障呼叫本身的开销,然后补偿它