调试并行Python程序(mpi4py)

8
我有一个与mpi4py相关的程序,它偶尔会卡住。如何跟踪各个进程正在执行什么任务?
我可以在不同的终端中运行程序,例如使用pdb。
mpiexec -n 4 xterm -e "python -m pdb my_program.py"

但是如果问题只在大量进程(在我的情况下约为80个)中出现,则此方法变得繁琐。另外,使用pdb可以轻松捕获异常,但我需要查看跟踪以确定发生挂起的位置。

1个回答

3
Python的trace模块允许您跟踪程序执行。为了单独存储每个进程的跟踪,您需要将代码包装在一个函数中:
def my_program(*args, **kwargs):
    # insert your code here
    pass

然后使用trace.Trace.runfunc运行它:

import sys
import trace

# define Trace object: trace line numbers at runtime, exclude some modules
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix],
    ignoremods=[
        'inspect', 'contextlib', '_bootstrap',
        '_weakrefset', 'abc', 'posixpath', 'genericpath', 'textwrap'
    ],
    trace=1,
    count=0)

# by default trace goes to stdout
# redirect to a different file for each processes
sys.stdout = open('trace_{:04d}.txt'.format(COMM_WORLD.rank), 'w')

tracer.runfunc(my_program)

现在每个进程的跟踪将被写入一个单独的文件trace_0001.txt等。使用ignoredirsignoremods参数来省略低级调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接