mpi4py中的profiling

上一篇中我们介绍了 mpi4py 中初始化和运行时设置,下面我们将介绍 mpi4py 中的 profiling。

API

下面是 mpi4py 中 profiling 相关的函数:

mpi4py.profile(name, **kargs)

MPI profiling 支持。name 是要导入的 profiler 库。其它可设置参数有:path,一系列由字符串表示的路径,用来搜寻所用的 profiler;logfile,profiler 所产生的日志文件前缀。在 mpi4py 中可用的 profiler 库有 MPE (Multi-Processing Environment) 和 VampirTrace。如果要使用 MPE,name 需要设置为 'mpe',此时可以通过参数 logfile 设置生成的日志文件的前缀,或等价地通过环境变量 MPE_LOGFILE_PREFIX 来设置生成的日志文件的前缀。如果使用 VampirTrace,则 name 可以设置为 'vt','vt-mpi' 和 'vt-hyb' 任意一个 profiler,此时可以通过参数 logfile 设置生成的日志文件的前缀,或等价地通过环境变量 VT_FILE_PREFIX 来设置生成的日志文件的前缀。

mpi4py.MPI.Pcontrol(int level)

MPI profiling 控制。level 参数设定 profiling 级别,level = 0 会关闭 profiling 操作,level = 1 使用默认的 profiling 详细等级, level = 2 会刷新 profile 缓冲区(有些 profiler 可能不会执行任何操作)。

MPE 简介

MPE (Multi-Processing Environment) 的主要功能是为用户提供一组性能调试、正确性验证和可视化的工具,包括:

  • 用于创建日志信息的函数,所输出的日志信息供可视化工具进行处理,可视化工具包括 upshot,nupshot,jumpshot 等。
  • 并行的 X-图形库。
  • 用于对并行代码进行串行化控制的函数。
  • 设置 Debugger 的函数。

可利用 MPE 提供的 3 种函数库——跟踪函数库、动画函数库和日志函数库进行应用程序的性能分析。

MPE 的功能非常丰富,但目前 mpi4py 仅支持使用其日志功能,所以这里只介绍日志的使用。

在创建日志文件之前,需考虑设置两个环境变量——MPE_LOG_FORMAT 和 TMPDIR。其中 MPE_LOG_FORMAT 用于定义 MPE 创建日志文件的类型,如果不设置,则默认使用 CLOG 格式。TMPDIR 定义各个进程临时存放日志数据的目录,默认目录为 /temp,为减少开销一般将其设置为当前目录。

CLOG 中包含了带时间标记的事件(events)信息,SLOG 中包含了带时间标记的状态(states)信息。在运行程序后会生成一个 *.clog2 文件,这是 MPE 库所默认使用的日志文件格式。可使用 clog2TOslog2 将该文件转换为 slog2 格式,然后就可以使用 jumpshot 打开该文件进行可视化分析。

安装和使用 MPE

有些版本的 MPICH/MPICH2 中包含 MPE。如果你所使用的 MPI 实现未包含 MPE 软件工具,则可以前往 https://www.mcs.anl.gov/research/projects/perfvis/download/index.htm 下载并使用类似下面的命令进行安装:

$ ./configure MPI_CC=mpicc CC=gcc MPI_F77=mpif77 F77=gfortran --enable-PIC --prefix=/paht/to/mpe2-x.x.x
$ make
$ make install

要在 mpi4py 程序中使用 MPE 生成日志,只需在 import MPI 之前加上类似下面的语句:

import mpi4py
mpi4py.profile('mpe‘, logfile='ring')

日志文件前缀也可以通过环境变量 MPE_LOGFILE_PREFIX 来设置。

加上以上语句后,运行 mpi4py 程序后就会生成 *.clog2 日志文件。

VampirTrace

VampirTrace 是一个可以生成并行应用程序(包括 MPI,OpenMP,Pthreads 等)的详细执行日志的开源软件库。除了以上典型的并行应用程序外,VampirTrace 还可以生成 GPU 加速的应用程序的执行日志。VampirTrace 生成的日志文件为 OTF (Open Trace Format) 格式,该格式的日志文件可以使用 Vampir 工具进行可视化分析。

安装和使用 VampirTrace

VampirTrace 已经包含在 OpenMPI (版本 1.3 及更高)中,因此,如果你使用的是高于 1.3 版本的 OpenMPI,则 VampirTrace 直接可用,在其它情况下,可以在 https://tu-dresden.de/zih/forschung/projekte/vampirtrace 下载 VampirTrace 并安装。

要在 mpi4py 程序中使用 VampirTrace 生成日志,只需在 import MPI 之前加上类似下面的语句:

import mpi4py
mpi4py.profile('vt', logfile='ring')

可以根据需要将其中的 'vt' 改为 'vt-mpi' 或者 'vt-hyb'。日志文件前缀也可以通过环境变量 VT_FILE_PREFIX 来设置。

加上以上语句后,运行 mpi4py 程序后就会生成 *.otf 日志文件。前往 https://vampir.eu/downloads 下载并安装 Vampir 后,就可以使用 vampir 工具可视化分析生成的日志文件了。

使用 mpi4py 的 profiling 功能

mpi4py 的 profiling 功能需要有 PAPI (Performance Application Programming Interface) 的支持,前往 http://icl.cs.utk.edu/papi/software/index.html 下载并安装 PAPI。

较早的 mpi4py 软件由于一些编译选项设置不合理导致 mpi4py 程序在加上 profiling 语句后不生成日志文件(程序可以正常并正确执行),不过最新的 mpi4py 已经改正了这个问题,可以在 https://bitbucket.org/mpi4py/mpi4py/overview 下载最新的 mpi4py,安装后就可以使用其 profiling 功能了。

例程

下面这个例程展示 MPE profiler 的使用。

# ring_mpe.py

"""
Demonstrates mpi4py profiling with MPE.

Run this with 8 processes like:
$ mpiexec -n 8 python ring_mpe.py
"""

import os
os.environ['MPE_LOGFILE_PREFIX'] = 'ring'
import mpi4py
mpi4py.profile('mpe')
# or
# mpi4py.profile('mpe', logfile='ring')

from mpi4py import MPI
from array import array

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

src  = rank-1
dest = rank+1
if rank == 0:
    src = size-1
if rank == size-1:
    dest = 0

try:
    from numpy import zeros
    a1 = zeros(1000000, 'd')
    a2 = zeros(1000000, 'd')
except ImportError:
    from array import array
    a1 = array('d', [0]*1000); a1 *= 1000
    a2 = array('d', [0]*1000); a2 *= 1000

comm.Sendrecv(sendbuf=a1, recvbuf=a2,
              source=src, dest=dest)

MPI.Request.Waitall([
    comm.Isend(a1, dest=dest),
    comm.Irecv(a2, source=src),
    ])

运行结果如下:

$ mpiexec -n 8 python ring.py
Writing logfile....
Enabling the Default clock synchronization...
Finished writing log file ring.clog2
$ clog2TOslog2 ring.clog2
...
$ jumpshot ring.slog2
jumpshot 分析 MPE 日志

在上图中可以看到消息在各个进程间的交换及执行时间。

下面这个例程展示 VampirTrace 中 vt profiler 的使用。

# ring_vt.py

"""
Demonstrates mpi4py profiling with VampirTrace.

Run this with 8 processes like:
$ mpiexec -n 8 python ring_vt.py
"""

# If you want VampirTrace to log MPI calls, you have to add the two
# lines below at the very beginning of your main bootstrap script.
import mpi4py
mpi4py.rc.threads = False
mpi4py.profile('vt', logfile='ring')

from mpi4py import MPI

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

src  = rank-1
dest = rank+1
if rank == 0:
    src = size-1
if rank == size-1:
    dest = 0

try:
    from numpy import zeros
    a1 = zeros(1000000, 'd')
    a2 = zeros(1000000, 'd')
except ImportError:
    from array import array
    a1 = array('d', [0]*1000); a1 *= 1000
    a2 = array('d', [0]*1000); a2 *= 1000

comm.Sendrecv(sendbuf=a1, recvbuf=a2,
              source=src, dest=dest)

MPI.Request.Waitall([
    comm.Isend(a1, dest=dest),
    comm.Irecv(a2, source=src),
    ])

运行结果如下:

$ mpiexec -n 8 python ring_vt.py
$ vampir ring.otf.
vampir 分析 VampirTrace 日志

以上介绍了 mpi4py 中的 profiling,在下一篇中我们将介绍 mpi4py 中的 futures 模块。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 在上一篇中我们介绍了 mpi4py 并行读/写 numpy npy 文件的方法,下面我们将介绍 mpi4py 软件...
    自可乐阅读 2,092评论 0 0
  • 前言 计算机编程语言很多,但是适合高性能数值计算的语言却并不多,在高性能计算的项目中通常会使用到的语言有 Fort...
    自可乐阅读 19,672评论 3 22
  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 6,558评论 5 24
  • 在上一篇中我们介绍了 mpi4py 中 I/O 相关的 hints,下面我们将介绍 mpi4py 中 I/O 操作...
    自可乐阅读 890评论 0 0
  • 我一直以为是我名方,所以别人会常常对我说“你很方”。 我以为是和“你很王菲”一样特立独行的酷,今天才晓得,“你很方...
    我是大方阅读 206评论 6 6