2017-06-04 82 views
0

我在mpi4py執行該程序的麻煩。我的目標是將特定數據發送到特定節點(這就是爲什麼我不使用分散)。之後,處理每個節點中的數據,最後收集所有結果。發送特定的數據每個節點,並收集結果MPI的Python

很顯然,我的程序不明白如何收集數據,從不同的節點(也許是因爲收集的設計與分散的工作)。我試着用comm.send()發送日期,並用comm.gather()進行收集。當我執行程序時,它會永遠運行,而我看不到任何結果。

你能幫我找出如何從不同的節點收集的數據?還有其他的功能嗎?我可能需要在節點上循環嗎?

from mpi4py import MPI 
import numpy as np 

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

if rank == 0: 
    data = list(np.arange(size) + 1) 
    for i in range(size): 
     comm.send(data[i], dest=i) 
else: 
    data = comm.recv(source=0) 
    data += 1 

print("rank", rank, "has data", data) 

newData = comm.gather(data, root = 0) 

if rank == 0: 

    print("master collected", newData) 
+0

在我的情況下,它不會永遠運行,我會看到結果。 – Shibli

回答

0

您需要使用Scatter。它正是你想要做的。看到這裏的一個例證:http://mpitutorial.com/tutorials/mpi-scatter-gather-and-allgather/

+2

*「你需要使用Scatter [...]你不能收集沒有分散。」*這是絕對錯誤的。 *「這正是你想要做的。」*正確。 – Zulan

+0

@Zulan:謝謝,在使用其他一些系統一段時間後,我的MPI術語混淆了。 :)現在更正文字。 –

+0

謝謝,夥計們!這澄清了我一些東西。但是你知道我怎麼能一個一個地發送元素嗎?我的問題是,我不想加載所有數據,然後將其發送到節點(數據非常大,而且比內存大)。理想情況下,我想加載數據1,發送到節點。然後,加載數據2,發送到一個節點。等等。最後,收集節點的所有結果。比我見過的例子假設你將數據一次性分散。@ JohnZwinck,@Zulan –

1

爲什麼這是阻塞的原因是您正在嘗試之前匹配的接收被張貼到從等級0發送數據到自身。這是一個僵局。現在你可以簡單地跳過從0級發送到它自己 - 只需複製適當的數據。或者您可以使用非阻塞點對點通信(isend/irecv)。

但是,你不應該。這種慣用的方法的確使用scatter,它的工作原理很好,例如:

if rank == 0: 
    full_data = list(np.arange(size) + 1) 
else: 
    full_data = None 
data = comm.scatter(full_data) 
+0

一般來說,如果不應該與自身交換數據,則可以在根級別上使用'MPI_IN_PLACE'。 他這樣說,我不知道是否/如何'mpi4py'處理該 –

+0

我相當肯定你不能用'MPI_IN_PLACE'與小寫酸洗MPI函數。 – Zulan