python
  • mpi
  • gil
  • mpi4py
  • multiple-processes
  • 2016-04-07 11 views 0 likes 
    0

    変数の各コミュニケータのIDを表示するにはどうすればよいですか?以下は、このアイデアを証明しようとする試みである:MPIでmpi4py各コミュニケータインスタンスのリストに値idを追加します。

    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, dtest=comm.rank) 
    
    mpi_id_list = [] 
    for i in range(comm.size): 
        mpi_id_list.append(comm.recv(source=i, tag=11)) 
    
    print mpi_id_list 
    
    +1

    質問は私には明確ではありません。作成しようとしているデータ構造の目的は何ですか?この* list *の内容をどのように定義しますか?リストは各ランクで同じにする必要がありますか?違う?マスターのみ?また、あなたのサンプルコードは 'send'よりも' recv'を投稿しているので、動作しません。 – Zulan

    +0

    はい有効なバージョンの実装方法がわかりません。 Pythonの 'id'関数は、オブジェクトに関連付けられた識別子を示します。オブジェクトは常にコミュニケータ上で同じIDをオンにしますが、ID番号は各コミュニケータで異なります。私は、各コミュニケータのオブジェクトに関連付けられているIDのリストを希望します。コードは 'mpi_id'の割り当てに対応しています。これは、各リストエントリに必要な形式です。 – kilojoules

    +0

    _MPIランク/ processes_を_communicators_と間違えていると思います。後者は、MPI通信が行われる論理コンテキストであり、前者は実際の通信エンティティです。 –

    答えて

    1

    を、各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 
    
    関連する問題