Python多过程并行处理程序编写实践活动——mpi4

阅读  ·  发布日期 2021-02-19 12:18  ·  admin
在高特性测算的新项目中大家一般都会应用高效率更高的编译程序型的語言比如C、C++、Fortran等,可是因为Python的灵便性和易用性使得它在发展趋势和认证优化算法层面备受人们的亲睐因而在高特性测算行业也常常能看到Python的影子了。本文简易详细介绍在Python自然环境下应用MPI插口在群集勤奋行多过程并行处理测算的方式。

这里我先对MPI开展1下简易的详细介绍,MPI的全称是Message Passing Interface,即信息传送插口。

它其实不是1门語言,而是1个库,大家能够用Fortran、C、C++融合MPI出示的插口来将串行通信的程序流程开展并行处理化解决,还可以觉得Fortran+MPI或C+MPI是1种再原先串行通信語言的基本上拓展出来的并行处理語言。
它是1种规范而并不是特殊的完成,实际的能够有许多不一样的完成,比如MPICH、OpenMPI等。
它是1种信息传送程序编写实体模型,说白了,它便是专业服务于过程间通讯的。
MPI的工作中方法很好了解,大家能够另外起动1组过程,在同1个通讯域中不一样的过程都有不一样的序号,程序流程员能够运用MPI出示的插口来给不一样序号的过程分派不一样的每日任务和协助过程互相沟通交流最后进行同1个每日任务。就如同承包人给工人们编到了工号随后特定1个计划方案来给不一样序号的工人分派每日任务并让工人互相沟通交流进行每日任务。

因为CPython中的GIL的存在大家能够临时不奢求能在CPython中应用线程同步运用多核資源开展并行处理测算了,因而大家在Python中能够运用多过程的方法充足运用多核資源。

Python中大家可使用许多方法开展多过程程序编写,比如os.fork()来建立过程或根据multiprocessing控制模块来更便捷的建立过程和过程池等。在上1篇《Python多过程并行处理程序编写实践活动-multiprocessing控制模块》中大家应用过程池来便捷的管理方法Python过程而且根据multiprocessing控制模块中的Manager管理方法遍布式过程完成了测算的多机遍布式测算。

与线程同步的共享资源式运行内存不一样,因为各个过程全是互相单独的,因而过程间通讯再多过程中饰演这十分关键的人物角色,Python中大家可使用multiprocessing控制模块中的pipe、queue、Array、Value这些专用工具来完成过程间通信和数据信息共享资源,可是在撰写起来依然具备很大的不灵便性。而这1层面更是MPI所善于的行业,因而假如可以在Python中启用MPI的插口那简直太完善了并不是么。

mpi4py是1个搭建在MPI之上的Python库,关键应用Cython撰写。mpi4py使得Python的数据信息构造能够便捷的在多过程中传送。mpi4py是1个很强劲的库,它完成了许多MPI规范中的插口,包含点对点通讯,组内结合通讯、非堵塞通讯、反复非堵塞通讯、组间通讯等,基础上我能想起用到的MPI插口mpi4py中都有相应的完成。不但是Python目标,mpi4py对numpy也是有很好的适用而且传送高效率很高。另外它还出示了SWIG和F2PY的插口可以让大家将自身的Fortran或C/C++程序流程在封裝成Python后依然可以应用mpi4py的目标和插口来开展并行处理解决。可见mpi4py的作者的功力确实是是非非常了得。mpi4py出示了相应的插口Init()和Finalize()来原始化和完毕mpi自然环境。可是mpi4py根据在__init__.py中写入了原始化的实际操作,因而在大家from mpi4py import MPI的情况下就早已全自动原始化mpi自然环境。

MPI_Finalize()被申请注册到了Python的C插口Py_AtExit(),这样在Python过程完毕情况下就会全自动启用MPI_Finalize(), 因而已不必须大家显式的去掉用Finalize()。

通讯域(Communicator)

mpi4py立即出示了相应的通讯域的Python类,在其中Comm是通讯域的基类,Intram和Interm是其派生类,这根MPI的C++完成中是同样的。

另外它也出示了两个预订义的通讯域目标:
包括全部过程的COMM_WORLD
只包括启用过程自身的COMM_SELF

通讯域目标则出示了与通讯域有关的插口,比如获得当今过程号、获得通讯域内的过程数、获得过程组、对过程组开展结合运算、切分合拼这些。

有关通讯域与过程组的实际操作这里就不细讲了,能够参照Introduction to Groups and Communicators

mpi4py出示了点对点通讯的插口使很多个过程间可以相互之间传送Python的内嵌目标(根据pickle编码序列化),另外也出示了立即的数字能量数组传送(numpy数字能量数组,贴近C語言的高效率)。

假如大家必须传送通用性的Python目标,则必须应用通讯域目标的方式中小写的插口,比如send(),recv(),isend()等。

假如必须立即传送数据信息目标,则必须启用大写的插口,比如Send(),Recv(),Isend()等,这与C++插口中的拼写是1样的。

MPI中的点到点通讯有许多中,在其中包含规范通讯,缓存文件通讯,同歩通讯和准备就绪通讯,另外上面这些通讯又有非堵塞的多线程版本号这些。这些在mpi4py中都有相应的Python版本号的插口来让大家更灵便的解决过程间通讯。这里我只用规范通讯的堵塞和非堵塞版本号来做个举例:

这里我尝试应用mpi4py的插口在两个过程中传送Python list目标。

全部的堵塞通讯mpi都出示了1个非堵塞的版本号,相近与大家撰写多线程程序流程不堵塞在耗时的IO上是1样的,MPI的非堵塞通讯也不容易堵塞信息的传送全过程中,这样可以充足运用解决器資源提高全部程序流程的高效率。非堵塞通讯的信息推送和接纳:
一样的,大家还可以写1个上面事例的非堵塞版本号。

适用Numpy数字能量数组

mpi4py的1个很好的特性便是他对Numpy数字能量数组有很好的适用,大家能够根据其出示的插口来立即传送数据信息目标,这类方法具备很高的高效率,基础上和C/Fortran立即启用MPI插口类似(方法和实际效果)

比如我想传送长度为10的int数字能量数组,MPI的C++插口是:在mpi4py的插口中也及其相近, Comm.Send()中必须接受1个Python list做为主要参数,在其中包括所传数据信息的详细地址,长度和种类。

来个堵塞规范通讯的事例:PI组通讯和点到点通讯的1个关键差别便是,在某个过程组内全部的过程另外报名参加通讯,mpi4py出示了便捷的插口让大家进行Python中的组内结合通讯,便捷程序编写另外提升程序流程的可读性和可移殖性。

广播节目实际操作是典型的1对多通讯,将跟过程的数据信息拷贝到同组内别的全部过程中。

在Python中我想将1个目录广播节目到别的过程中:

与广播节目不一样,发散能够向不一样的过程推送不一样的数据信息,而并不是彻底拷贝。

搜集全过程是发散全过程的逆全过程,每一个过程将推送缓存区的信息推送给根过程,根过程依据推送过程的过程号将各有的信息储放到自身的信息缓存区中。

别的的组内通讯也有归约实际操作这些因为篇数限定就很少讲了,有兴趣爱好的能够去看看MPI的官方文本文档和相应的教材内容。

mpi4py并行处理程序编写实践活动

这里我就上篇中的2重循环系统绘图map的事例来应用mpi4py开展并行处理加快解决。

我准备另外起动10个过程来将每一个0轴必须测算和绘图的数据信息推送到不一样的过程开展并行处理测算。

因而我必须将pO2s数字能量数组发散到10个过程中:

以后我必须在每一个过程中依据接纳到的pO2s的数据信息再开展1次pCOs循环系统来开展测算。

最后将每一个过程测算的結果(TOF)开展搜集实际操作:

因为编码全是涉及到的技术专业有关的物品我就不全列出来了,将mpi4py改了的并行处理版本号放到10个过程中实行可见:高效率提高了10倍上下。

本文简易详细介绍了mpi4py的插口在python中开展多过程程序编写的方式,MPI的插口十分巨大,相应的mpi4py也十分巨大,mpi4py也有完成了相应的SWIG和F2PY的封裝文档和种类投射,可以协助大家将Python同真实的C/C++和Fortran程序流程在信息传送上完成统1。有兴趣爱好的同学能够进1步科学研究1下,欢迎沟通交流。

本文来源于: 作者:武汉企业网站建设 互联网营销推广方案策划,本文由武汉版权全部,未经准许转载必究。

武汉市武昌区武珞路442号华中国际性城D座2号楼3305

027⑻7317566 400⑻084-027