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:
简单来说,三种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。
好像也就这样吧。
没探索完,之后继续。