VTune 分析 MPI 程序

        本文来自于一篇英特尔的技术文档,讲解了如何用 VTune 和 Inspector 工具分析 MPI 程序。我在实际工作中用到的是 VTune 工具。没用过的不好说,不过两者操作起来很是相似。

        用 VTune 分析 MPI 程序,就像把大象装冰箱,分三步:

  • 用 amplxe-cl 和 inspxe-cl 命令行工具收集程序数据。默认情况下会分析所有进程,也可过滤数据,分析一部分进程。每个被分析的进程都会单独创建一个目录存放数据,以进程号作为后缀区分。
  • 对结果进行“后处理”,这是自动完成的。
  • 通过图形化或命令行的查看器查看分析数据。
  • 收集性能或正确性数据
  • $ mpirun –n <N> <abbr>-cl –r my_result \
    > -collect <analysis type> my_app [my_app_ options]
    

    <abbr> 代表“amplxe”或“inspxe”。命令“amplxe-cl -help collect”可以列出支持的分析类型。例子中用到的“mpirun”命令可以对应到实际中的“mpiexec”或“mpiexec.hydra”,根据实际情况而定。mpirun 是一个高层次的命令,根据当前默认设置或者传输的参数可以派生出 mpiexec 或 mpiexec.hydra。

            有时候只是要对一部分进程收集信息,比如下面的例子只对 16 个进程中的 2 个收集信息:

    $ mpirun –host myhost -n 14 ./a.out : -host myhost -n 2 \
    > amplxe-cl –r foo -c hotspots ./a.out
    

    为了方便一些,可以把上面的内容写到一个配置文件中

    # config.txt configuration file
    -host myhost -n 14 ./a.out
    -host myhost -n 2 amplxe-cl -quiet -collect hotspots -r foo ./a.out
    

    根据配置文件执行 mpirun:

    $ mpirun –configfile ./config.txt
    

    上面的“myhost”也可以分别设置成不同的。根据不同系统环境中对进程号的不同分配方式,得到的存放数据的目录可能也会稍有不同(体现在文件夹后缀上)。

  • 结束数据收集(Finalizing)
  •         这部分工作是在每个节点上自动进行的,有的情况下(符号文件存放在默认位置以外的其他位置),就需要使用“-search-dir”选项:

    $ mpirun –np 128 amplxe-cl –q -collect hotspots \
    > –search-dir sym=/home/foo/syms ./a.out
    
  • 查看数据
  •         可以用命令行工具根据采集到的数据生成数据报告,也可以使用图形化工具直接查看程序数据。使用“inspxe-cl -help report”或者“amplxe-cl -help report”可以查看生成报告相关选项。下面是一个例子:

    $ amplxe-cl -R hotspots -q -format text –r r003hs
    Function  Module  CPU Time
    --------  ------  --------
    f         a.out   6.070
    main      a.out   2.990
    
    $ amplxe-cl -R hotspots -q -format text -group-by module –r r003hs
    Module  CPU Time
    ------  -------- 
    a.out   9.060
    

    图形化工具,用“{amplxe|inspxe}-gui ”启动,结果直观,不多说。

  • 局限性
    • 不支持动态 MPI 进程。比如 MPI_Comm_spawn。
    • 基于硬件事件的采样收集器在同一时间只能在一台主机上执行一个取样任务,不同的任务之间会相互干扰。
    • 默认情况下,Intel MPI 在轮询任务时采用 spinning 方式,VTune 不会将之识别为等待时间,这样就会使得 CPU 时间比实际上要久。为了避免这种情况,把环境变量 I_MPI_WAIT_MODE 设置为 enable,这样会使 MPI 使用常规的 wait 而不是 spinning。

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注