簡體   English   中英

MPI4PY大arrays散射產生死鎖

[英]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 分散和聚集大 numpy arrays

和這里

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.floatMPI.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM