を、各comm.send(...,dest=x)
はランクx
のプロセスによって実行comm.recv(...)
によって一致する必要があります。すべてのメッセージはランク0のプロセスに送信され、プロセス0はこれらのメッセージをすべて受信する必要があります。この操作は、削減と呼ばれる集約操作です。
次のコードは、この例では、すべてのプロセスに結果のリストをブロードキャストする一括操作comm.bcast()
を利用することmpirun -np 4 main.py
from mpi4py import MPI
comm = MPI.COMM_WORLD
obj = "I am an example. My ID is unique to each communicator."
mpi_id = 'rank %i has id %s'%(comm.rank, str(id(obj)))
comm.send(mpi_id, tag=11, dest=0)
mpi_id_list = []
if comm.rank==0:
mpi_id_list = []
for i in range(comm.size):
mpi_id_list.append(comm.recv(source=i, tag=11))
print mpi_id_list
#broadcasting the list
mpi_id_list = comm.bcast(mpi_id_list, root=0)
#now, the list is the same on all processes.
print "rank "+str(comm.rank)+" has list "+str(mpi_id_list)
注意を入力して4つのプロセスで実行することができます。さまざまな集合操作のmpi4pyの例については、https://mpi4py.scipy.org/docs/usrman/tutorial.htmlを参照してください。例えば、あなたはcomm.allreduce()
操作によって誘惑さ:
list=comm.allreduce([mpi_id])
print list
質問は私には明確ではありません。作成しようとしているデータ構造の目的は何ですか?この* list *の内容をどのように定義しますか?リストは各ランクで同じにする必要がありますか?違う?マスターのみ?また、あなたのサンプルコードは 'send'よりも' recv'を投稿しているので、動作しません。 – Zulan
はい有効なバージョンの実装方法がわかりません。 Pythonの 'id'関数は、オブジェクトに関連付けられた識別子を示します。オブジェクトは常にコミュニケータ上で同じIDをオンにしますが、ID番号は各コミュニケータで異なります。私は、各コミュニケータのオブジェクトに関連付けられているIDのリストを希望します。コードは 'mpi_id'の割り当てに対応しています。これは、各リストエントリに必要な形式です。 – kilojoules
_MPIランク/ processes_を_communicators_と間違えていると思います。後者は、MPI通信が行われる論理コンテキストであり、前者は実際の通信エンティティです。 –