0

mpi4pyを使用して8x8マトリックスから4x4マトリックスサブマトリックスを送信しようとしている簡単なプログラムを作成しています。私のアプローチは、部分配列データ型を使用することですが、セグメンテーション違反が発生し続けます。

私のコードは次のとおりです。

import numpy as np
from mpi4py import MPI

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

sizes = (8,8)    # Matrix dimensions
subsizes = (4,4) # Sub-matrix dimensions
displs = (0, 4, 32, 36)

counts = (1, 1, 1, 1) 
starts = (0,0)

mynum = counts[rank]
glob = np.empty((8,8), dtype = 'f')
local = np.empty((4,4), dtype = 'f')

if rank == 0:  # Fill each quadrant with 0-3

    for row in range(0,4):
        for col in range(0,4):
            glob[row, col] = 0
    for row in range(0,4):
        for col in range(4,8):
            glob[row, col] = 1
    for row in range(4,8):
        for col in range(0,4):
            glob[row, col] = 2
    for row in range(4,8):
        for col in range(4,8):
            glob[row, col] = 3
    print glob

submatrixType = MPI.DOUBLE.Create_subarray(sizes, subsizes, starts, order =    MPI.ORDER_C)
submatrixType.Commit()

sendbuf = [glob, counts, displs, submatrixType]
recvbuf = [local, 16, MPI.DOUBLE]

comm.Scatterv(sendbuf, recvbuf, root = 0)
# or use
#comm.Scatterv(sendbuf, recvbuf, MPI.DOUBLE)

print rank, " " ,local

4 つのプロセスで実行した場合の結果は次のとおりです。

Proc 0: [[0. 0. 0. 0.] 
[1. 1. 1. 1.]
[0. 0. 0. 0.]
[1. 1. 1. 1.]]

Traceback (most recent call last):
Traceback (most recent call last):
  File "main.py", line 41, in <module>
      File "main.py", line 41, in <module>
    comm.Scatterv(sendbuf, local, root = 0)
comm.Scatterv(sendbuf, local, root = 0)
  File "Comm.pyx", line 454, in mpi4py.MPI.Comm.Scatterv (src/mpi4py.MPI.c:67458)
  File "Comm.pyx", line 454, in mpi4py.MPI.Comm.Scatterv (src/mpi4py.MPI.c:67458)
mpi4py.MPImpi4py.MPI.Exception: .Exception: MPI_ERR_TRUNCATE: message truncated
MPI_ERR_TRUNCATE: message truncated
Traceback (most recent call last):
  File "main.py", line 41, in <module>
    comm.Scatterv(sendbuf, local, root = 0)
  File "Comm.pyx", line 454, in mpi4py.MPI.Comm.Scatterv (src/mpi4py.MPI.c:67458)
mpi4py.MPI.Exception: MPI_ERR_TRUNCATE: message truncated

Create_subarray について間違った考えを持っていますか、それとも他に何が間違っているのでしょうか?

4

1 に答える 1

0

問題はあなたの「変位」にあります。'sizes'、'subsizes'、および 'starts' を使用して部分配列型を正しく記述しましたが、この型を置き換えると、実際の 2 次元配列の末尾から型記述をシフトしました。

通常、他のタイプを置き換えることは問題ではありませんが、部分配列では、この「元の配列」の概念が問題を引き起こす可能性があります。

VECTOR を簡単に置き換えましたが、それでもメモリが破損しました。

于 2015-04-23T16:47:57.407 に答える