1

2D プロセッサ グリッド (3*3) があります。

P00、P01、P02 は R0 にあり、P10、P11、P12 は R1 にあり、P20、P21、P22 は R2 にあります。P*0 は同じコンピューターにあります。P*1 と P*2 も同様です。

ここで、R0、R1、R2 が同時に MPI_Bcast を呼び出して、P*0 から p*1 および P*2 にブロードキャストできるようにします。

MPI_Bcast を使用すると、1 行だけブロードキャストするのに必要な時間の 3 倍の時間がかかることがわかりました。

たとえば、R0 で MPI_Bcast のみを呼び出すと、1.00 秒かかります。しかし、すべての R[0, 1, 2] で 3 つの MPI_Bcast を呼び出すと、合計で 3.00 秒かかります。これは、MPI_Bcast が並行して動作できないことを意味します。

MPI_Bcast を同時にブロードキャストする方法はありますか? (1 つのノードが同時に 3 つのチャネルでブロードキャストします。)

ありがとう。

4

2 に答える 2

5

私があなたの質問を正しく理解していれば、行ごとの同時ブロードキャストが必要です。

P00 -> P01 & P02
P10 -> P11 & P12
P20 -> P21 & P22

これは、サブコミュニケーターを使用して行うことができます。たとえば、行 0 からのプロセスのみを含むサブコミュニケーター、行 1 からのプロセスのみを含むサブコミュニケーターなどです。MPI_Bcast次に、適切なコミュニケーター引数を指定して呼び出すことにより、各サブコミュニケーターで同時ブロードキャストを発行できます。

最初にデカルト コミュニケーターを使用すると、行単位のサブコミュニケーターを作成するのは非常に簡単です。MPI はそのためのMPI_CART_SUB操作を提供します。それは次のように機能します:

// Create a 3x3 non-periodic Cartesian communicator from MPI_COMM_WORLD
int dims[2] = { 3, 3 };
int periods[2] = { 0, 0 };
MPI_Comm comm_cart;

// We do not want MPI to reorder our processes
// That's why we set reorder = 0
MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, 0, &comm_cart);

// Split the Cartesian communicator row-wise
int remaindims[2] = { 0, 1 };
MPI_Comm comm_row;

MPI_Cart_sub(comm_cart, remaindims, &comm_row);

Nowcomm_rowには、呼び出しプロセスが存在するのと同じ行のみにまたがる新しいサブコミュニケーターへのハンドルが含まれます。MPI_Bcastnow を 1 回呼び出すだけで、3 つの行単位の同時ブロードキャストを実行できます。

MPI_Bcast(&data, data_count, MPI_DATATYPE, 0, comm_row);

これは、異なる行にあるプロセスではcomm_row返される asが異なるため、機能します。これは、サブコミュニケーターの最初のプロセスのランクであり、トポロジーが構築された方法に対応します。MPI_Cart_sub0comm_rowP*0

デカルト コミュニケーターを使用せずに操作する場合は、 を使用してワールド コミュニケーターを 3 つの行単位のサブコミュニケーターに分割MPI_COMM_WORLDできます。は、プロセスを新しいサブコミュニケーターにグループ化するために使用される を受け取ります。同じサブコミュニケーターで終了する同じプロセスです。あなたの場合、呼び出しプロセスが存在する行の数に等しくなければなりません。分割操作は、新しいサブコミュニケーターでプロセスを順序付けるために使用される も取ります。呼び出しプロセスが含まれる列の番号と同じにする必要があります。たとえば、次のようになります。MPI_COMM_SPLITMPI_COMM_SPLITcolorcolorcolorkey

// Compute grid coordinates based on the rank
int proc_row = rank / 3;
int proc_col = rank % 3;
MPI_Comm comm_row;

MPI_Comm_split(MPI_COMM_WORLD, proc_row, proc_col, &comm_row);

ここでもcomm_row、呼び出しプロセスと同じ行のみにまたがるサブコミュニケーターのハンドルが含まれます。

于 2012-07-07T10:28:06.080 に答える
1

MPI-3.0 ドラフトには、ノンブロッキングMPI_Ibcastコレクティブが含まれています。ノンブロッキング コレクティブはまだ公式には標準に含まれていませんが、MPICH2 と (私が思うに) OpenMPI では既に利用可能です。

または、別のスレッドからブロッキング呼び出しを開始することもできますMPI_Bcast(R0、R1、および R2 が異なるコミュニケーターであると想定しています)。

3 番目の可能性 (可能な場合と不可能な場合があります) は、必要なブロードキャストが 1 つだけになるようにデータを再構築することです。

于 2012-07-07T05:50:17.543 に答える