2013-07-16 45 views
0

我需要執行一個for循環,該循環作用於許多數據點,每個數據點獨立於任何其他數據點。在python中展開數據並行循環,必須在MPI環境下工作

在範圍X(1,10000000) some_procedure(X)

,我需要使其運行速度更快,通過利用數據並行,但我有MPI工作。

我正在使用mpi4py,但對此我完全陌生。哪一個理論上在選項a和b之間理論上工作得更快,以及爲什麼:

a。在foo.py:

from mpi4py import MPI 

sendbuf=[] 
root=0 
comm = MPI.COMM_WORLD 
if comm.rank==0: 
    sendbuf= range(0,10000000) 

v=comm.scatter(sendbuf,root) 
some_procedure(v) 

後來執行以下操作:

mpiexec -np 10000000 python foo.py 

灣或 從mpi4py進口MPI
進口SYS client_script = 'some_procedure.py' COMM = MPI.COMM_SELF.Spawn(sys.executable,ARGS = [client_script],=的MaxProcs 10000000)

非常感謝預先!!

+3

無論你做什麼都不要啓動10^7進程,除非你有一臺擁有10^7處理器的機器。一般來說,特別是在熟悉MPI時,不要啓動比使用處理器(或內核)更多的進程。 –

回答

1

我認爲你誤解了MPI的用途。 MPI是允許進程進行通信的消息傳遞接口。它不需要定期編寫代碼並自動將其並行化,也不會執行任何類似線程的輕量級執行,從而可以在系統上嚴重超載。正如@High Performance Mark所說的,(直到你真的知道你在做什麼),你不應該擁有比你的機器上的物理內核(無論是你的筆記本電腦還是羣集)更多的MPI進程。

通常情況下,您要做的事情更像是取整個數據範圍,並將其劃分爲可用的進程數量。您擁有的流程越多,數據分割的越多,並且(理論上)您的程序可以執行得越快。

一個例子可能是這樣的(這將是僞-C,因爲我不熟悉mpi4py,但你也許可以找出我的意思):

datasize = 1000000; 

MPI_Init(...); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 

mydata_size = data size/size; 
mystart = rank * mydata_size; 

/* Do something for data[mystart...mydata_size] */ 

而不是試圖創建每個元素有一個進程,您可以創建儘可能多的進程,並相應地分配數據。