2015-04-07 4 views
0

Je crée un programme simple où j'essaie d'envoyer des matrices matricielles 4 x 4 à partir d'une matrice 8x8 en utilisant mpi4py. Mon approche est d'utiliser le type de données subarray, mais je continue d'obtenir des fautes de segmentation.Sous-type de données avec mpi4py

Mon code est le suivant:

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 

Mes résultats sont les suivants lors de l'exécution avec 4 processus:

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 

Dois-je une mauvaise idée de Create_subarray ou quoi d'autre pourrait être le problème?

Répondre

0

Le problème est avec vos 'déplacements'. Vous avez correctement décrit un type de sous-réseau avec 'sizes', 'subsizes' et 'starts', mais lorsque vous déplacez ce type, vous avez déplacé la description du type à la fin du tableau 2d réel.

Le déplacement d'autres types n'est généralement pas un problème, mais avec subarray, vous avez cette notion de "tableau original" qui va poser des problèmes.

J'ai fait une substitution rapide pour VECTOR, mais j'ai toujours une corruption de mémoire.

+0

J'ai fini d'utiliser C++ pour mon application à la place. Le mpi4py ne l'a pas vraiment coupé à la fin et j'ai eu des problèmes à résoudre le pas de mémoire. Merci pour votre participation! – Hamps