MPI性能分析工具:TAU Profiler

0. 简介

TAU是一个面向MPI与OpenMP并行程序的profiler,在目前看到的OpenMPI的Profiler中算是比较健全的一个(x)。官网:https://www.cs.uoregon.edu/research/tau/home.php。然而国内网站上看到的教程比较少,并且编译的时候容易出bug,在这里记录一下。

其实Intel的vtune也不是不能用,但是面向OpenMPI的时候会有些限制。TAU可以根据不同的MPI发行版重新编译,感觉会好一些。

1. 安装

官方的INSTALL中给出的configure建议参数:

% ./configure -c++=mpicxx -cc=mpicc -fortran=mpif90 -mpi -ompt -iowrapper -bfd=download -dwarf=download -otf=download -unwind=download -pdt=<path_to_pdt_dir>

pdt不使用,因为是一个挺大的东西,目前还没用过。而且一般profile到第二层就足够了(见使用部分)。ompt也有比较大的概率不支持,可以直接关掉。ompt是貌似是OpenMP提供给外部工具的一个接口,如果没有OpenMP成分的话关掉没什么影响。(https://www.openmp.org/spec-html/5.0/openmpsu15.html)

之后发现BFD也是直接下载不了,关了。没发现有什么用。

最后改成:

./configure -c++=mpicxx -cc=mpicc -fortran=mpif90 -mpi -iowrapper -dwarf=download -otf=download -unwind=download -prefix=<prefix>

configure结束之后有提示。根据提示添加一下PATH,然后直接make install即可。TAU的编译过程是内含在install过程中的。

在make install的过程中,大概率是要报错的。这也是TAU比较令我无语的一个地方……它的动态库编译flag基本上都是错的。需要进行一个手动修改。

在主目录的Makefile下,在Line 195左右的位置,把编译命令换成:

(-diag-disable是针对intel编译器的,如果不是intel编译器记得去掉。其实都可以去掉,但是现在用icc不加这个选项就会报出一堆的warning,看着心烦)

@echo "*********** RECURSIVELY MAKING SUBDIRECTORIES ***********"
        @for i in ${SUBDIR}; do (echo "*** COMPILING $$i DIRECTORY"; cd $$i;\
             $(MAKE) "MAKE=$(MAKE)" "CC=$(CC) -diag-disable=10441 -fPIC" "TAU_F90=$(TAU_F90) -fPIC" "TAU_CC=$(TAU_CC) -fPIC" "CXX=$(CXX) -diag-disable=10441 -fPIC" "AR_SHFLAGS=-shared" "TAU_SHFLAGS=-shared -o" install ) || exit $$?; done

这里其实就是改了一堆flag。这样编译就可以正常通过了。至此完成安装。

2.使用

TAU提供了三种详细程度不同的profile:

截屏2023-03-24 上午10.09.29

简单来说,三种profile方式详细程度逐渐提高,但最粗略的不需要重新编译,第二种需要重新编译,最详细的一种要求使用PDT。

2.1 interposition

这个最简单。从

mpirun <mpi-args> <program>

换成

mpirun <mpi-args> tau_exec <program> 

即可。熟悉vtune的话会觉得差不多。

这样的方式可以得到各个MPI函数的占用的时间,但是没法得到callpath等更细致的信息。

2.2 recompile

需要重新编译。

TAU的configure方式比较特殊。如果在配置完一个TAU之后,再在相同的目录下configure一个配置不同的TAU,其内容不会被覆盖,而是两个版本并存。TAU通过一个Makefile来决定使用哪种配置,Makefile在<prefix>/x86_64/lib下。

相应控制TAU的配置的环境变量是TAU_MAKEFILE.

TAU提供的编译器是tau_cc.sh,tau_f90.sh等,其实就是一层wrapper,根据MAKEFILE的内容来指定底层实际的编译器。用这几个命令来编译的时候也可以看到,就是多连接了一些库。

recompile之后不需要额外的运行参数,只需要正常运行就能生成profile文件。不过说实话,如果不开启一些环境变量,感觉和interposition相比也没有丰富多少。

PROFILEDIR=$PWD/tau-pro mpirun --host f0104:72,f0105:72 -n 144 <program>

有用的环境变量包括:

TAU_TRACE:开启tracing。生成文件的格式会改变,并且会变得很大。此时文件夹由TRACEDIR决定。

TAU_COMM_MATRIX:为1时启动通讯记录。这样profile中会记录下哪个进程与哪个进程进行了多少通讯,比较直观。

TAU_CALLPATH:为1时追踪函数的调用记录。没有开的时候,只会记录下这个函数总的调用花了多少时间;开了之后会记录从哪个函数中调用这个函数花了多少时间。不过,在recompile等级下好像也没法追踪到自定义的函数体(可能是因为我profile的是fortran的代码?不清楚),并且展开之后会比较乱,也不一定好用。

最后得到的文件使用paraprof工具可以进行可视化。能实现的比较有用的功能:

  • 单个进程的各个MPI函数调用时间排序;
  • 单个MPI函数在各个进程上调用时间分布直方图;
  • Communication Matrix。

好像也就这样吧。

没探索完,之后继续。

posted @ 2023-03-24 21:35  undermyth  阅读(1161)  评论(0编辑  收藏  举报