python中mpi4py的所有基礎(chǔ)使用案例詳解
python中mpi4py的基礎(chǔ)使用
大多數(shù) MPI 程序都可以使用命令 mpiexec 運(yùn)行。在實(shí)踐中,運(yùn)行 Python 程序如下所示:
$ mpiexec -n 4 python script.py
案例1:測(cè)試comm.send 和comm.recv函數(shù),代碼如下
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0:
? ? data = {'a': 7, 'b': 3.14}
? ? comm.send(data, dest=1, tag=11)
elif rank == 1:
? ? data = comm.recv(source=0, tag=11)rank代表進(jìn)程編號(hào),其總數(shù)是mpiexec -n中的n的個(gè)數(shù),最大的n受到電腦cpu內(nèi)核數(shù)的限制
dest代表發(fā)送的目標(biāo),tag是一個(gè)標(biāo)志位可以忽略,source為數(shù)據(jù)來(lái)源rank標(biāo)志
案例2:具有非阻塞通訊的python對(duì)象
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0:
? ? data = {'a': 7, 'b': 3.14}
? ? req = comm.isend(data, dest=1, tag=11)
? ? req.wait()
elif rank == 1:
? ? req = comm.irecv(source=0, tag=11)
? ? data = req.wait()案例3: 快速發(fā)送實(shí)例
這里的Send和Recv都是大寫,用于numpy數(shù)據(jù)的傳輸
from mpi4py import MPI import numpy comm = MPI.COMM_WORLD rank = comm.Get_rank() # passing MPI datatypes explicitly if rank == 0: ? ? data = numpy.arange(1000, dtype='i') ? ? comm.Send([data, MPI.INT], dest=1, tag=77) elif rank == 1: ? ? data = numpy.empty(1000, dtype='i') ? ? comm.Recv([data, MPI.INT], source=0, tag=77) # automatic MPI datatype discovery if rank == 0: ? ? data = numpy.arange(100, dtype=numpy.float64) ? ? comm.Send(data, dest=1, tag=13) elif rank == 1: ? ? data = numpy.empty(100, dtype=numpy.float64) ? ? comm.Recv(data, source=0, tag=13)
案例4:集體通訊,廣播機(jī)制
廣播機(jī)制就是將當(dāng)前root=0端口下的所有信息發(fā)送到任何一個(gè)進(jìn)程
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank == 0:
? ? data = {'key1' : [7, 2.72, 2+3j],
? ? ? ? ? ? 'key2' : ( 'abc', 'xyz')}
else:
? ? data = None
data = comm.bcast(data, root=0)案例5:scatter,將root=0下的數(shù)據(jù)一次分發(fā)到各個(gè)rank下
from mpi4py import MPI comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank() if rank == 0: ? ? data = [(i+1)**2 for i in range(size)] else: ? ? data = None data = comm.scatter(data, root=0) assert data == (rank+1)**2
案例6:gather,將所有rank下的數(shù)據(jù)收集到root下
from mpi4py import MPI comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank() data = (rank+1)**2 data = comm.gather(data, root=0) if rank == 0: ? ? for i in range(size): ? ? ? ? assert data[i] == (i+1)**2 else: ? ? assert data is None
案例7,numpy的廣播機(jī)制
與之前一樣都是大寫
from mpi4py import MPI import numpy as np comm = MPI.COMM_WORLD rank = comm.Get_rank() if rank == 0: ? ? data = np.arange(100, dtype='i') else: ? ? data = np.empty(100, dtype='i') comm.Bcast(data, root=0) for i in range(100): ? ? assert data[i] == i
案例8:numpy的Scatter機(jī)制
from mpi4py import MPI import numpy as np comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank() sendbuf = None if rank == 0: ? ? sendbuf = np.empty([size, 100], dtype='i') ? ? sendbuf.T[:,:] = range(size) recvbuf = np.empty(100, dtype='i') comm.Scatter(sendbuf, recvbuf, root=0) assert np.allclose(recvbuf, rank)
案例9:numpy的Gather機(jī)制
from mpi4py import MPI import numpy as np comm = MPI.COMM_WORLD size = comm.Get_size() rank = comm.Get_rank() sendbuf = np.zeros(100, dtype='i') + rank recvbuf = None if rank == 0: ? ? recvbuf = np.empty([size, 100], dtype='i') comm.Gather(sendbuf, recvbuf, root=0) if rank == 0: ? ? for i in range(size): ? ? ? ? assert np.allclose(recvbuf[i,:], i)
案例10 :allgather機(jī)制
allgather就是 scatter 加上廣播機(jī)制。
rank0 = a
rank1 = b
rank2 = c
allgather后結(jié)果為
rank0 = a,b,c
rank1 = a,b,c
rank2 = a,b,c
from mpi4py import MPI import numpy def matvec(comm, A, x): ? ? m = A.shape[0] # local rows ? ? p = comm.Get_size() ? ? xg = numpy.zeros(m*p, dtype='d') ? ? comm.Allgather([x, ?MPI.DOUBLE], ? ? ? ? ? ? ? ? ? ?[xg, MPI.DOUBLE]) ? ? y = numpy.dot(A, xg) ? ? return y
到此這篇關(guān)于一文讀懂python中mpi4py的所有基礎(chǔ)使用的文章就介紹到這了,更多相關(guān)python mpi4py使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python制作一個(gè)數(shù)據(jù)預(yù)處理小工具(多種操作一鍵完成)
這篇文章主要介紹了使用Python制作一個(gè)數(shù)據(jù)預(yù)處理小工具(多種操作一鍵完成),本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
python與matlab一些常用函數(shù)互轉(zhuǎn)問(wèn)題
這篇文章主要介紹了python與matlab一些常用函數(shù)互轉(zhuǎn),包括十六進(jìn)制字節(jié)流數(shù)據(jù)的相關(guān)知識(shí),本文通過(guò)示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12python 實(shí)現(xiàn)圖片修復(fù)(可用于去水?。?/a>
這篇文章主要介紹了python 實(shí)現(xiàn)圖片修復(fù)(可用于去水?。瑤椭蠹腋玫睦斫夂褪褂胦pencv庫(kù),感興趣的朋友可以了解下2020-11-11
Pygame游戲開(kāi)發(fā)之太空射擊實(shí)戰(zhàn)子彈與碰撞處理篇
相信大多數(shù)8090后都玩過(guò)太空射擊游戲,在過(guò)去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來(lái)自己動(dòng)手實(shí)現(xiàn)它,在編寫學(xué)習(xí)中回顧過(guò)往展望未來(lái),下面開(kāi)始講解子彈與碰撞處理,在本課中,我們將添加玩家與敵人之間的碰撞,以及添加供玩家射擊的子彈2022-08-08
Python在Console下顯示文本進(jìn)度條的方法
Python是一門與php有點(diǎn)像的編輯語(yǔ)言了,下文來(lái)給各位在利用Python實(shí)現(xiàn)進(jìn)度條了,對(duì)Python在Console下顯示文本進(jìn)度條的方法相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-02-02
基于python select.select模塊通信的實(shí)例講解
下面小編就為大家?guī)?lái)一篇基于python select.select模塊通信的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Python使用pyenv實(shí)現(xiàn)多環(huán)境管理
這篇文章主要介紹了Python使用pyenv實(shí)現(xiàn)多環(huán)境管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

