2013-03-07 35 views
2

我在寫一個mpi python代碼。例如,四個特效有如下數據:用運算符減少mpi4py中的每個元素的列表

data on procs0: [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
data on procs1: [0, 0, 0, 4, 5, 6, 0, 0, 0, 0, 0, 0] 
data on procs2: [0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0] 
data on procs3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12] 

我想用減少mpi4py庫函數,以減少對procs0數據,結果:

result on procs0: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 

我怎樣才能使用mpi4py它lib函數?

編輯:以上 是,集不能使用,請參見下面的其他情況下,簡單的特例:

data on procs0: [1,0,0,0,0,0] 
data on procs1: [0,2,0,0,0,0] 
data on procs2: [0,0,0,3,0,0] 
data on procs3: [0,0,0,0,4,5] 

理想的結果必須是:

result on procs0: [1,2,0,3,4,5] 
+0

我不確定mpi4py,但我認爲你應該使用[MPI_Reduce](http://www.mcs.anl.gov/research/projects/mpi/www/www/MPI_Reduce.html)和MPI_MAX作爲操作。 – 2013-03-09 12:25:11

回答

0

使用列表理解連同壓縮,存儲的最大值爲每列

In [1]: procs0=[1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]  
In [2]: procs1=[0, 0, 0, 4, 5, 6, 0, 0, 0, 0, 0, 0] 
In [3]: procs2=[0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0] 
In [4]: procs3=[0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12] 

In [5]: [max(i) for i in zip(procs0, procs1, procs2, procs3)] 
Out[5]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
+0

我認爲OP想要添加所有列表的第一個元素,第二個元素等。 – Dhara 2013-03-07 12:55:14

+0

看到我的修改。 – xunzhang 2013-03-07 13:01:23

+0

我現在看到。抱歉! – 2013-03-07 13:35:51

4

我不知道從你的問題,如果你想要的數據的總和,或最大。我已經用mpi Reduce函數編寫了一個簡單的例子,該函數計算總和。

#!/usr/bin/env python 
import numpy as np 
from mpi4py import MPI 
comm = MPI.COMM_WORLD 

comm.Barrier() 
t_start = MPI.Wtime() 

# this array lives on each processor 
data = np.zeros(5) 
for i in xrange(comm.rank, len(data), comm.size): 
    # set data in each array that is different for each processor 
    data[i] = i 

# print out the data arrays for each processor 
print '[%i]'%comm.rank, data 
comm.Barrier() 

# the 'totals' array will hold the sum of each 'data' array 
if comm.rank==0: 
    # only processor 0 will actually get the data 
    totals = np.zeros_like(data) 
else: 
    totals = None 

# use MPI to get the totals 
comm.Reduce(
    [data, MPI.DOUBLE], 
    [totals, MPI.DOUBLE], 
    op = MPI.SUM, 
    root = 0 
) 

# print out the 'totals' 
# only processor 0 actually has the data 
print '[%i]'%comm.rank, totals 

comm.Barrier() 
t_diff = MPI.Wtime() - t_start 
if comm.rank==0: print t_diff 

保存文件reduce_test.py在此代碼,可以在命令mpirun -np 3 ./reduce_test.py運行它給我的機器上輸出如下:

[0] [ 0. 0. 0. 3. 0.] 
[1] [ 0. 1. 0. 0. 4.] 
[2] [ 0. 0. 2. 0. 0.] 
[1] None 
[2] None 
[0] [ 0. 1. 2. 3. 4.] 
0.00260496139526 

注意更改參數op = MPI.SUM在調用comm.Reduceop = MPI.MAX會計算最大值而不是總和。

相關問題