1

mpirun と 2 つのコアでプロセスを実行していますが、2 つのプロセス間で値を混合している時点で強制終了されます。どちらのプロセスもマシンのメモリの約 15% を使用し、ミキシング時にメモリが増加しても、まだ十分なメモリが残っているはずです。したがって、プロセス間でメッセージを渡すために使用されるメモリの量には制限があると想定しています。この制限を確認するにはどうすればよいですか? また、それを削除するにはどうすればよいですか?

mpirun が終了したときに表示されるエラー メッセージは次のとおりです。

File "Comm.pyx", line 864, in mpi4py.MPI.Comm.bcast (src/mpi4py.MPI.c:67787)
File "pickled.pxi", line 564, in mpi4py.MPI.PyMPI_bcast (src/mpi4py.MPI.c:31462)
File "pickled.pxi", line 93, in mpi4py.MPI._p_Pickle.alloc (src/mpi4py.MPI.c:26327)
SystemError: Negative size passed to PyBytes_FromStringAndSize

そして、これはエラーにつながるコードのビットです:

sum_updates_j_k = numpy.zeros((self.col.J_total, self.K), dtype=numpy.float64))        
comm.Reduce(self.updates_j_k, sum_updates_j_k, op=MPI.SUM) 
sum_updates_j_k = comm.bcast(sum_updates_j_k, root=0) 

コードは通常は機能しますが、大量のデータでのみ問題が発生するため、プロセス間で交換するマトリックスのサイズが大きくなります

4

4 に答える 4

2

原因は、おそらく のコードにある次の行ですPyMPI_bcast()

cdef int count = 0
...
if dosend: smsg = pickle.dump(obj, &buf, &count)  # <----- (1)
with nogil: CHKERR( MPI_Bcast(&count, 1, MPI_INT, # <----- (2)
                              root, comm) )
cdef object rmsg = None
if dorecv and dosend: rmsg = smsg
elif dorecv: rmsg = pickle.alloc(&buf, count)
...

ここで何が起こるかというと、まずオブジェクトが(1)usingpickle.dump()でシリアル化され、次にピクルされたストリームの長さが でブロードキャストされ(2)ます。

ここには 2 つの問題があり、どちらもint長さに使用されるという事実に関係しています。最初の問題は内部の整数キャストでpickle.dumpあり、もう 1 つの問題はMPI_INTピクルされたストリームの長さを送信するために使用されることです。これにより、マトリックス内のデータ量が特定のサイズに制限されます。つまり、ピクルされたオブジェクトが 2 GiB (2 31 -1 バイト) を超えないサイズになります。これより大きなオブジェクトは整数オーバーフローを引き起こし、結果として負の値になりcountます。

これは明らかに MPI の問題ではなく、 のバグ (または機能?)mpi4pyです。

于 2013-11-18T09:02:55.867 に答える
1

最近、mpi4py で同じ問題が発生しました。Hristo Iliev が回答で指摘したように、これはピクルスの問題です。

これは、 のような小文字のメソッドとは対照的に、pickle に頼らない大文字のメソッド comm.Reduce()comm.Bcast()などを使用することで回避できます。おまけとして、大文字のメソッドも少し高速になるはずです。comm.reduce()

実際、あなたはすでに を使用しているcomm.Reduce()ので、 に切り替えることcomm.Bcast()で問題が解決するはずです-私にとってはそうでした.

注意: 大文字のメソッドの構文は少し異なりますが、このチュートリアルは開始するのに役立ちます。

たとえば、次の代わりに:

sum_updates_j_k = comm.bcast(sum_updates_j_k, root=0) 

あなたが使用します:

comm.Bcast(sum_updates_j_k, root=0) 
于 2016-03-08T13:48:19.247 に答える