2015-04-07 2 views
0

Я делаю простую программу, где я пытаюсь отправить 4 x 4 матричные подматрицы из матрицы 8x8, используя mpi4py. Мой подход заключается в использовании типа данных subarray, но я продолжаю получать ошибки сегментации.Subarray datatype с mpi4py

Мой код выглядит следующим образом:

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 или что еще может быть не так?

ответ

0

Проблема заключается в ваших «смещениях». Вы правильно описали тип подмашины с «размерами», «подрезами» и «запусками», но когда вы вытесняете этот тип, вы смещали описание типа с конца реального массива 2d.

Перемещение других типов обычно не является проблемой, но с подмассивом у вас есть это понятие «исходного массива», которое будет давать проблемы.

Я сделал быструю подпитку для VECTOR, но у меня все еще есть повреждение памяти.

+0

Вместо этого я использовал C++ для своего приложения. В конце концов, mpi4py на самом деле не отрезал его, и у меня возникли проблемы с переходом к памяти. Спасибо за ваш вклад! – Hamps