2017-10-20 29 views
1

간헐적으로 응답하지 않는 mpi4py 프로그램이 있습니다. 개별 프로세스가 수행하는 작업을 어떻게 추적 할 수 있습니까?병렬 파이썬 프로그램 (mpi4py) 디버깅

나는 pdb

mpiexec -n 4 xterm -e "python -m pdb my_program.py" 

를 사용하여 예를 들어, 서로 다른 단말기에서 프로그램을 실행할 수 있습니다 그러나 문제는 프로세스의 많은 수의 (~ 80 내 경우)로 나타난다 경우이 복잡 가져옵니다. 또한 pdb으로 예외를 잡기는 쉽지만 행이 어디에서 발생하는지 파악하려면 추적을 볼 필요가 있습니다.

답변

0

파이썬 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 등으로 작성하십시오. 하위 레벨 호출을 생략하려면 및 ignoremods 인수를 사용하십시오.