2012-09-20 7 views
1

으로 불연속 데이터를 전송 I는 다른 노드에 대한 영구 MPI 요청을 통해이 매트릭스의 보낼 크기 (N, M)파이썬 : mpi4py

mat = np.random.randn(N, M) 

과의 C 오더링 행렬을 . 그러나

sreq = MPI.COMM_WORLD.Send_Init((mat[:,idx], MPI.DOUBLE), send_id, tag) 

비 연속되는 슬라이스의 계정에 실패 mpi4py를 사용하여. 누군가가 이것에 대해 갈 방법을 제안 할 수 있습니까? 나는 C를 믿는다. MPI_Type_vector은 타입을 만들 때 stride을 지정할 수있다. 어떻게 이것을 mpi4py에서 할 수 있습니까?

+0

을 numpy' 행렬 (행이 지속적으로 메모리에 할당되는 포함) C에서 2 차원 배열과 같은 방식으로 저장되는'경우 당신이 할 수있는 C에서와 같이 스트라이핑 된 벡터 형식을 구성합니다. –

답변

0

sendbuffer를 만드십시오! 이 예에서 보기 :

1 #!/usr/bin/python2 
    2 # -*- coding: utf-8 -*- 
    3 
    4 from mpi4py import MPI 
    5 import numpy as np 
    6 
    7 comm = MPI.COMM_WORLD 
    8 rank = comm.Get_rank() 
    9 
10 matrix = np.empty((5, 10), dtype='f') 
11 for y in xrange(len(matrix)): 
12  for x in xrange(len(matrix[0])): 
13   matrix[y,x] = rank * 10 + x * y 
14 
15 sendbuf = np.empty(5, dtype='f') 
16 
17 #column 1 
18 sendbuf[:] = matrix[:,1] 
19 
20 result = comm.gather(sendbuf, root=0) 
21 
22 if rank == 0: 
23  for res in result: 
24   print res 

이 당신에게 줄 것이다 :

$ mpirun -np 4 column.py 
[ 0. 1. 2. 3. 4.] 
[ 10. 11. 12. 13. 14.] 
[ 20. 21. 22. 23. 24.] 
[ 30. 31. 32. 33. 34.]