[英]MPI4PY big arrays scattering produce deadlock
我正在嘗試使用Scatter()
在 3 個進程之間使用雙精度np.float64
的數據類型分散一個大小為 (3,512,512,48,2) 的數組:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
if __name__ == "__main__":
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float64)
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatter([a, MPI.DOUBLE], a_split, root = 0)
但是,程序會出現死鎖。 從我從這里找到的
和這里
mpi4py Scatterv function 沿哪個軸拆分 numpy 陣列?
對於大 arrays,我必須使用Scatterv()
function。 所以,這里是另一個使用這個 function 的代碼:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
if __name__ == "__main__":
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float64)
size = 512*512*48*2
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatterv([a,(size,size,size),(0,size,2*size),MPI.DOUBLE],a_split,root =0)
然而,這也導致了僵局。 我還嘗試使用與Send()
、 Recv()
的點對點通信發送 arrays ,但這無濟於事。 似乎死鎖僅取決於數組大小 - 例如,如果我將 arrays 的大小從[512,512,48,2]
更改為[512,10,48,2]
,則代碼有效。
誰能建議我在這種情況下可以做什么?
一個問題是你混合np.float
和MPI.DOUBLE
。 一個工作腳本可以是:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float)
a_split[:,:,:,:] = -666
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float)
print(a.shape)
print('Scattering')
comm.Scatter(a, a_split, root = 0)
print(a_split[1,1,1,1], a_split[-1,-1,-1,-1])
我添加了最后一行以顯示-np 4
可以工作但不能完全填充a_split
; 並且-np 2
因截斷錯誤而失敗。 我的猜測是-np 3
是有意的。
如果您有意使用 np.float 和 MPI.DOUBLE,請在問題中提及並添加您用於啟動程序的-np
。
[編輯]這也是你的腳本的 C++ 版本,所以你可以看看它是否也死鎖:
// mpic++ scat.cxx && mpirun -np <asmuchasyouwant> ./a.out
#include <iostream>
#include <vector>
#include <mpi.h>
int main(int argc, char** argv)
{
MPI_Init(&argc, &argv);
unsigned sz = 1*512*512*48*2;
int rank, nbproc;
std::vector<double> a;
std::vector<double> a_split(sz);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nbproc);
if (rank == 0) {
a.resize(nbproc * sz);
std::fill(a.begin(), a.end(), 2.71);
}
else {
std::fill(a_split.begin(), a_split.end(), -666.666);
}
MPI_Scatter(a.data(), sz, MPI_DOUBLE,
a_split.data(), sz, MPI_DOUBLE,
0,
MPI_COMM_WORLD
);
std::cout << rank << " done " << a_split[sz-1] << std::endl;
MPI_Finalize();
}
所以,最后,解決方案非常簡單——我通常不會關閉我的電腦,這似乎就是它在大量計算后產生死鎖的原因。 簡單的重啟解決了這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.