網站首頁 編程語言 正文
python中mpi4py的基礎使用
大多數 MPI 程序都可以使用命令 mpiexec 運行。在實踐中,運行 Python 程序如下所示:
$ mpiexec -n 4 python script.py
案例1:測試comm.send 和comm.recv函數,代碼如下
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代表進程編號,其總數是mpiexec -n中的n的個數,最大的n受到電腦cpu內核數的限制
dest代表發送的目標,tag是一個標志位可以忽略,source為數據來源rank標志
案例2:具有非阻塞通訊的python對象
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: 快速發送實例
這里的Send和Recv都是大寫,用于numpy數據的傳輸
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:集體通訊,廣播機制
廣播機制就是將當前root=0端口下的所有信息發送到任何一個進程
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下的數據一次分發到各個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下的數據收集到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的廣播機制
與之前一樣都是大寫
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機制
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機制
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機制
allgather就是 scatter 加上廣播機制。
rank0 = a
rank1 = b
rank2 = c
allgather后結果為
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
原文鏈接:https://blog.csdn.net/alsj123456/article/details/126382097
相關推薦
- 2023-04-19 Git綁定遠程倉庫報錯error: remote origin already exists.
- 2022-07-02 element-ui及時清除驗證規則
- 2022-03-16 c#語言程序構建基塊_C#教程
- 2022-12-01 Redis的數據存儲及String類型的實現_Redis
- 2024-01-16 linux查看外網ip的5種方法
- 2022-01-03 yarn版本過低導致的報錯
- 2022-11-06 React中Suspense及lazy()懶加載及代碼分割原理和使用方式_React
- 2022-07-14 Python中添加搜索路徑的方法實例_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支