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?
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