4

私はmpi pythonコードを書いています。たとえば、4 つの proc には以下のデータがあります。

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 ライブラリの reduce 関数を使用して、procs0 のデータを削減したいと考えています。結果は次のとおりです。

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

mpi4py lib関数を使用してどのように作成できますか?

編集済み: 上記は単純な特殊なケースです。set は使用できません。以下の別のケースを参照してください。

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]
4

2 に答える 2

9

あなたの質問から、データの合計が必要なのか、それとも最大が必要なのかわかりません。合計を計算するmpiReduce関数を使用した簡単な例を作成しました。

#!/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

于 2013-11-20T18:57:51.843 に答える
0

リスト内包表記を zip と共に使用して、各列の最大値を保存します

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]
于 2013-03-07T12:53:09.683 に答える