MPI\u Alltoall能比MPI\u Alltoall跑赢多少?

MPI\u Alltoall能比MPI\u Alltoall跑赢多少?,mpi,Mpi,我想知道在传输的数据量大致相同的情况下,执行MPI\u Alltoallv和MPI\u Alltoall函数在运行时间上有什么区别?我找不到任何这样的基准测试结果。我对大规模实例感兴趣,其中使用了数万个或更好的数十万个MPI进程,并且这些进程对应于给定HPC系统的很大一部分(最好考虑一些现代系统,如BG/Q、Cray XC30、Cray XE6等)。概述 MPI_Alltoall的一大优点是,协议决策可以快速做出,因为它们依赖于少量标量。相反,如果库实现者希望将MPI_Alltoallv优化,他

我想知道在传输的数据量大致相同的情况下,执行
MPI\u Alltoallv
MPI\u Alltoall
函数在运行时间上有什么区别?我找不到任何这样的基准测试结果。我对大规模实例感兴趣,其中使用了数万个或更好的数十万个MPI进程,并且这些进程对应于给定HPC系统的很大一部分(最好考虑一些现代系统,如BG/Q、Cray XC30、Cray XE6等)。

概述 MPI_Alltoall的一大优点是,协议决策可以快速做出,因为它们依赖于少量标量。相反,如果库实现者希望将MPI_Alltoallv优化,他们必须扫描四个向量,以确定通信是否接近均匀、高度稀疏或其他模式

另一个问题是MPI_Alltoall可以轻松地将输出缓冲区用作暂存空间,因为每个进程都提供和消耗相同数量的数据。对于MPI_Alltoallv来说,做所有的簿记是不现实的,因此将分配所有的临时空间。我不记得这个问题的细节,但我想我已经在MPI佳能的某个地方读过了

实现框架 alltoallv至少有两种特殊情况,其中一种可以比MPI库更好地进行优化:

  • 近似同构通信,即计数向量近似恒定。当您的分布式阵列不能在进程网格中均匀分布时,就会发生这种情况。在这种情况下,您可以:

  • 填充阵列并直接使用MPI_all调用

  • 对具有同构通信的进程子集使用MPI_Alltoall,其余部分使用MPI_Alltoallv或一批Send Recv。如果您可以缓存关联的通讯器,则此操作效果最佳。使用非阻塞通信也会有所帮助

  • 编写自己的Bruck实现,处理计数变化的情况,这可能在向量的末尾。由于我自己没有做过这件事,我不知道这件事有多困难或有多值得

  • 稀疏通信,即计数向量包含大量零。在这种情况下,只需使用一批非阻塞的Send-Recv和Waitall,因为这可能是MPI库所能做的最好的事情,如果需要的话,您可以自行调整批大小

  • 论文 描述与向量集合相关的可伸缩性问题。诚然,您可能看不到在大多数CPU上扫描向量参数的成本,但这是一个O(n)问题,它促使实现者不必过多地接触向量参数

    描述一个自定义实现,该实现的性能比优化的库要好得多。这样的优化很难在MPI库中实现,因为它可能相当专业化。(顺便说一句,这篇文章是针对Hristo的评论,而不是你的问题。)

    密码 通过比较这些操作在MPICH(和)中的实现,您可以发现一些有趣的事情。仅MPI_全部用于所有用途和成对交换。类似的结论可以从上的
    I\u MPI\u ADJUST\u ALLTOALL
    I\u MPI\u ADJUST\u ALLTOALLV
    的可用选项中得出。这些限制是基本的还是仅仅实用的,留给读者作为练习

    实践经验 当MPI_Alltoall on Blue Gene/p使用DCMF_Alltoallv()时,与MPI_Alltoallv没有区别,后者甚至可能更好,因为应用程序预先填充了向量参数

    我写了一个版本的all-to-all交换为Blue Gene/Q,速度和MPI_-Alltoall一样快。我的版本对常量和向量参数是不可知的,所以这个结果意味着MPI_Alltoall的性能与MPI_Alltoall类似。但是,我现在找不到代码来完全确定细节

    然而,Blue Gene网络非常特殊,特别是w.r.t.全对全,因此在CPU速度远高于网络速度的系统上,胖树或龙型网络的行为将大不相同

    我建议您编写一个基准测试,并在您打算运行应用程序的地方对其进行测量。一旦您有了一些数据,就可以更容易地找出哪些优化可能会遗漏。

    Overview MPI_Alltoall的一大优点是,协议决策可以快速做出,因为它们依赖于少量标量。相反,如果库实现者希望将MPI_Alltoallv优化,他们必须扫描四个向量,以确定通信是否接近均匀、高度稀疏或其他模式

    另一个问题是MPI_Alltoall可以轻松地将输出缓冲区用作暂存空间,因为每个进程都提供和消耗相同数量的数据。对于MPI_Alltoallv来说,做所有的簿记是不现实的,因此将分配所有的临时空间。我不记得这个问题的细节,但我想我已经在MPI佳能的某个地方读过了

    实现框架 alltoallv至少有两种特殊情况,其中一种可以比MPI库更好地进行优化:

  • 近似同构通信,即计数向量近似恒定。当您的分布式阵列不能在进程网格中均匀分布时,就会发生这种情况。在这种情况下,您可以:

  • 填充阵列并直接使用MPI_all调用

  • 对具有同构通信的进程子集使用MPI_Alltoall,其余部分使用MPI_Alltoallv或一批Send Recv。如果您可以缓存关联的通讯器,则此操作效果最佳。使用非阻塞通信也会有所帮助

  • 写你自己的实现