1

データの配列を含むMPIプログラムがあります。すべてのランクは、その作業を行うためにすべての配列を必要としますが、配列のパッチでのみ機能します。計算ステップの後、配列の計算された部分を他のすべてのランクに伝達するために、すべてのランクが必要です。

これを効率的に達成するにはどうすればよいですか?

擬似コードでは、最初のアプローチとして次のようなことを行います。

if rank == 0: // only master rank
  initialise_data()
end if

MPI_Bcast(all_data,0) // from master to every rank

compute which part of the data to work on

for ( several steps ): // each rank
  execute_computation(part_of_data)

  for ( each rank ):
    MPI_Bcast(part_of_data, rank_number) // from every rank to every rank
  end for
end for

不利な点は、放送数が多いことです。つまり、ランクと同じ数のバリアがあります。では、MPI_Bcastsをどのように置き換えるのでしょうか。

編集:私はちょうどヒントを見つけたかもしれません...それは私が探しているMPI_Allgatherですか?

4

1 に答える 1

1

はい、あなたは探していMPI_Allgatherます。recvcountこれは受信バッファ全体の長さではありませんが、1つのプロセスからデータの量を受信する必要があることに注意してください。同様に、inMPI_Allgatherv recvcount[i]はi番目のプロセスから受信するデータの量です。さらに、recvcountそれぞれに等しい(少なくない)必要がありますsendcount。実装(OpenMPI)でテストしましたが、送信された要素を少なくしようとすると、MPI_ERR_TRUNCATEエラーが発生しました。

また、まれMPI_Allreduceにその子犬に使用しました。たとえば、次の配列がある場合:

process0: AA0000
process1: 0000BB
process2: 00CC00

MPI_SUM次に、操作を使用してAllreduceを実行しAACCBB、すべてのプロセスに参加できます。明らかに、同じトリックは、ゼロの代わりに1を使用して、およびの代わりに実行できMPI_PRODますMPI_SUM

于 2013-01-23T14:24:50.893 に答える