专栏名称: 开发者阿橙
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
Python爱好者社区  ·  软考,yyds ·  15 小时前  
Python爱好者社区  ·  Science披露:近3年,垃圾论文激增,9 ... ·  昨天  
Python爱好者社区  ·  64k!确实可以封神了! ·  4 天前  
Python爱好者社区  ·  公司Rust团队全员被裁,只因把服务写得「太 ... ·  2 天前  
Python爱好者社区  ·  强的离谱!CNN,yyds ·  3 天前  
51好读  ›  专栏  ›  开发者阿橙

Python多进程并行编程实践-mpi4py的使用

开发者阿橙  · 公众号  · Python  · 2017-02-23 23:05

正文

请到「今天看啥」查看全文


  • rank = comm . Get_rank ()

  • size = comm . Get_size ()


  • if rank == 0 :

  • data = range ( 10 )

  • comm . send ( data , dest = 1 , tag = 11 )

  • print ( "process {} send {}..." . format ( rank , data ))

  • else :

  • data = comm . recv ( source = 0 , tag = 11 )

  • print ( "process {} recv {}..." . format ( rank , data ))

  • 执行效果:

    1. zjshao@vaio:~/temp_codes/mpipy$ mpiexec -np 2 python temp.py

    2. process 0 send [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...

    3. process 1 recv [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...

    非阻塞标准通信

    所有的阻塞通信mpi都提供了一个非阻塞的版本,类似与我们编写异步程序不阻塞在耗时的IO上是一样的,MPI的非阻塞通信也不会阻塞消息的传递过程中,这样能够充分利用处理器资源提升整个程序的效率。

    来张图看看阻塞通信与非阻塞通信的对比:

    非阻塞通信的消息发送和接受:

    同样的,我们也可以写一个上面例子的非阻塞版本。

    1. from mpi4py import MPI                                        

    2. import numpy as np                                            

      comm = MPI.COMM_WORLD                                          

    3. rank = comm.Get_rank()                                        

    4. size = comm.Get_size()                                        


    5. if rank == 0:                                                  

    6.    data = range(10)                                          

    7.    comm.isend(data, dest=1, tag=11)                          

    8.    print("process {} immediate send {}...".format(rank, data))

    9. else:                                                          

    10.    data = comm.recv(source=0, tag=11)                        

    11.    print("process {} recv {}...".format(rank, data))          

    执行结果,注意非阻塞发送也可以用阻塞接收来接收消息:

    1. zjshao@vaio:~/temp_codes/mpipy$ mpiexec -np 2 python temp.py

    2. process 0 immediate send [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...

    3. process 1 recv [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]...

    支持Numpy数组

    mpi4py的一个很好的特点就是他对Numpy数组有很好的支持,我们可以通过其提供的接口来直接传递数据对象,这种方式具有很高的效率,基本上和C/Fortran直接调用MPI接口差不多(方式和效果)

    例如我想传递长度为10的int数组,MPI的C++接口是:

    1. void Comm::Send(const void * buf, int count,







    请到「今天看啥」查看全文