如何细粒度剖析非阻塞MPI调用的消息耗时分布?
低侵入性分析MPI非阻塞调用耗时的方案
1. 用MPI原生的性能工具
- MPI_Pcontrol接口:OpenMPI、MPICH这类主流MPI实现都支持这个接口,不用大改业务代码,只要在发起非阻塞调用的代码块前后插入
MPI_Pcontrol(1)(开启 profiling)和MPI_Pcontrol(0)(关闭),配合MPI自带的分析工具(比如OpenMPI的profiling库),就能按请求类型统计耗时。 - MPI_T性能变量查询:MPI提供了
MPI_T_pvar_*系列接口,能直接读取系统维护的性能计数器,比如非阻塞调用的发起、完成时间等维度数据,不用手动计时,直接按请求类型分类拉取统计结果。
2. 动态插桩/替换工具
- 编译器插桩:用GCC的
-finstrument-functions或者Clang的对应选项,给三种非阻塞MPI调用自动插桩,编译时加参数即可,无需修改业务代码。然后写个简单的回调函数,在调用进入和退出时记录时间,统计不同类型调用的总耗时。 - LD_PRELOAD动态库:自己写个轻量动态库,替换系统的
MPI_Irecv/MPI_Isend等非阻塞MPI函数,在替换的函数里记录请求类型和发起时间戳,再包装MPI_Testsome,在它返回完成请求时计算耗时并累加对应类型的统计数据。完全不用修改应用代码,运行时加载这个动态库就行。
3. 调整现有工具的分析粒度
- 别直接放弃DDT,试试开启它的细粒度MPI事件跟踪功能,部分版本支持配置跟踪单个MPI请求的全生命周期,包括发起和完成时间。导出跟踪数据后,用Python脚本(比如借助pandas)按请求类型分组统计,就能拿到每种类型的耗时占比,不用改代码,只是调整工具的分析配置。
4. 轻量手动计时(比全量MPI_Wtime侵入性低)
- 给存储MPI请求的数组配套一个辅助数组,每个位置对应记录请求的类型和发起时间戳。发起非阻塞调用时,顺手记录类型和当前
MPI_Wtime();调用MPI_Testsome拿到完成的请求后,用当前时间减去发起时间,累加对应类型的总耗时。这种方式只需要加几行代码,侵入性很低,实现起来也简单。
内容的提问来源于stack exchange,提问作者Joe Rowell
相关产品推荐
相关产品推荐

