1

mpi4py を使用して、処理タスクをコアのクラスターに分散しています。私のコードは次のようになります。

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

'''Perform processing operations with each processor returning 
   two arrays of equal size, array1 and array2'''

all_data1 = comm.gather(array1, root = 0)
all_data2 = comm.gather(array2, root = 0)

これにより、次のエラーが返されます。

SystemError: Negative size passed to PyString_FromStringAndSize

このエラーは、格納されているデータall_data1の配列が Python の配列の最大サイズを超えていることを意味していると思います。

私は次のように、より小さな部分でそれをやってみました:

comm.isend(array1, dest = 0, tag = rank+1)
comm.isend(array2, dest = 0, tag = rank+2)
if rank == 0:
    for proc in xrange(size):
        partial_array1 = comm.irecv(source = proc, tag = proc+1)
        partial_array2 = comm.irecv(source = proc, tag = proc+2)

しかし、これは次のエラーを返しています。

[node10:20210] *** Process received signal ***
[node10:20210] Signal: Segmentation fault (11)
[node10:20210] Signal code: Address not mapped (1)
[node10:20210] Failing at address: 0x2319982b

続いて、理解不能なパスのような情報と最終メッセージが大量に続きます。

mpirun noticed that process rank 0 with PID 0 on node node10 exited on signal 11 (Segmentation fault).

これは、使用しているプロセッサの数に関係なく発生するようです。

recvC での同様の質問の場合、解決策は、呼び出しの引数が解析される方法を微妙に変更しているようです。Python では構文が異なるため、このエラーが表示される理由と修正方法を明確にしていただけると幸いです。

4

1 に答える 1