使用mpi4py配置并行化的python脚本

时间:2015-11-03 15:39:20

标签: python parallel-processing profiler mpi4py

我有一个使用名为main_parallel.py的python的{​​{1}}脚本。我可以使用mpi4py time来衡量时间,但是,我如何制作类似于cProfile的个人资料?我想看看代码的每个部分的调用次数。我不能使用cProfile,因为它只用于串行代码。

谢谢!

2 个答案:

答案 0 :(得分:4)

为什么不能使用cprofile?你试过吗?

对于MPICH,我这样跑:

$ mpiexec -l -np 4 python -m cProfile ./simple-io.py doodad 

这给了我4组输出,但'-l'参数列出了每个输出位前面的MPI排名。注意:'-l'参数是MPICH特定的。 OpenMPI使用--tag-output。其他实现可能会使用其他东西。

我看到cprofile可以采用文件名参数。制作每个排名的输出文件,然后使用统计信息

进行处理
% python 
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pstats
>>> pstats.Stats("simple-io.cprofile").sort_stats('cumulative').print_stats()

给了我很多cprofile信息......但我的玩具程序太小了,不能给我任何有用的东西。

答案 1 :(得分:3)

正如Rob Latham所说,你可以使用cProfile。您可以将每个进程的输出保存在不同的文件中。如果你想分析一个函数你可以使用这样的装饰器:

from mpi4py import MPI
import cProfile

def profile(filename=None, comm=MPI.COMM_WORLD):
  def prof_decorator(f):
    def wrap_f(*args, **kwargs):
      pr = cProfile.Profile()
      pr.enable()
      result = f(*args, **kwargs)
      pr.disable()

      if filename is None:
        pr.print_stats()
      else:
        filename_r = filename + ".{}".format(comm.rank)
        pr.dump_stats(filename_r)

      return result
    return wrap_f
  return prof_decorator

@profile(filename="profile_out")
def my_function():
  # do something

可以使用snakeviz

显示每个流程的输出