MPI Profile
MPI程序开发者需要了解应用程序运行过程中的性能指标、通信模式以优化程序的性能,衍生出了相应的分析工具。MPI标准最初提供了Profile接口PMPI,分析工具可以通过PMPI接口拦截MPI调用,从而分析应用程序对不同MPI接口的调用次数与消耗的时间。然而使用PMPI并不能反映与追踪MPI内部实现的行为(如集合通信算法),为了弥补这一点,MPI 3.0标准引入了MPI Tool接口(MPI_T)。分析工具可以借助其查询MPI的内部信息。
参考的文章:
The MPI Tool Interfaces: Past, Present, and Future—Capabilities and Prospects
会议:The International Parallel Tools Workshop
DOI: 10.1007/978-3-030-66057-4_3
PMPI–MPI Profiling Interface
PMPI的实现如下图,MPI通常会将MPI_
定义为弱符号,将PMPI_
定义为弱符号,在MPI库中调用它们会产生同样的效果。不过分析工具可以重新定义MPI_
函数,增加需要的预处理、后处理内容,并在其中调用PMPI_
函数从而完成原有功能。由于MPI库中的MPI_
函数被定义为弱符号,因此可以被工具中新定义的函数覆盖。常用的MPI Profile工具TAU、mpiP、Score-P、Vampir等都有通过这一方式实现。
除了供上述Profile工具使用,PMPI也可以用到MPI调用正确性检测、快速改变单一MPI调用的实现(如通过调用点对点通信重新实现一个集合通信操作而不用在MPI库中进行更改)等方向上。
PMPI存在一些缺点,如无法深入刨析MPI调用内部的情况、它的设计模式导致同一时间只有一个基于PMPI的工具能够运行。文献[1]中的作者提出了QMPI,可以将不同工具基于PMPI实现的函数存在一张表中,动态选择。
MPI_T–MPI Tools Information Interface
正如之前多次提到的,PMPI实现中,MPI内部的行为仍然是一个黑盒子,我们只能在接口层面获取到应用程序的行为。这导致用户很难做进一步的优化。因此在MPI 3.0中产生了MPI_T。使用MPI_T,MPI库可以公开各种与性能或准确性相关的信息,如配置控制信息、性能信息、调试信息、应用程序调用相关信息。
3.0版本的MPI_T仅是一个查询接口,用户或分析工具可以从MPI内部获取信息,通过查询MPI_T接口能在运行时获得性能(P, Performance)、控制(C, Control)、变量目录(Variable Categories)相关数据与信息。
MPI_T的一个优点是具有很好的灵活性,不过由于它给出的信息大都基于文本,对其使用需要借助开发人员人工干预。
可以通过以下程序查询可用的变量 (related issue):
1 |
|
Control Variables
Control Variables(cvar)为用户公开了一系列变量,初衷是用户可以通过设置这些变量影响MPI实现在执行过程中的行为,不过目前版本应该也都只支持查询。以Open MPI为例,其组件注册的MCA参数大都作为cvar。通过对cvar的查询和更改,能够为一些工具实现新功能提供支持,如对于一些参数调优工具,原本需要多次运行程序遍历参数空间选出最优参数,借助cvar即可在一次运行中完成这一操作。
Performance Variables
Performance Variables(pvar)能够提供关于MPI库内部状态变化的信息,如发送消息的数据包数量、阻塞操作的运行时间或内存占用。
1 | 20 performance variables |
Reference
M. Schulz, M.-A. Hermanns, M. Knobloch, K. Mohror, N.T. Hjelm, B. Elis, K. Kraljic, D. Yang, The MPI Tool Interfaces: Past, Present, and Future—Capabilities and Prospects, in: H. Mix, C. Niethammer, H. Zhou, W.E. Nagel, M.M. Resch (Eds.), Tools for High Performance Computing 2018 / 2019, Springer International Publishing, Cham, 2021: pp. 55–83. https://doi.org/10.1007/978-3-030-66057-4_3. ↩︎