私があなたの質問を正しく理解していれば、行ごとの同時ブロードキャストが必要です。
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_Bcast
now を 1 回呼び出すだけで、3 つの行単位の同時ブロードキャストを実行できます。
MPI_Bcast(&data, data_count, MPI_DATATYPE, 0, comm_row);
これは、異なる行にあるプロセスではcomm_row
返される asが異なるため、機能します。これは、サブコミュニケーターの最初のプロセスのランクであり、トポロジーが構築された方法に対応します。MPI_Cart_sub
0
comm_row
P*0
デカルト コミュニケーターを使用せずに操作する場合は、 を使用してワールド コミュニケーターを 3 つの行単位のサブコミュニケーターに分割MPI_COMM_WORLD
できます。は、プロセスを新しいサブコミュニケーターにグループ化するために使用される を受け取ります。同じサブコミュニケーターで終了する同じプロセスです。あなたの場合、呼び出しプロセスが存在する行の数に等しくなければなりません。分割操作は、新しいサブコミュニケーターでプロセスを順序付けるために使用される も取ります。呼び出しプロセスが含まれる列の番号と同じにする必要があります。たとえば、次のようになります。MPI_COMM_SPLIT
MPI_COMM_SPLIT
color
color
color
key
// 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
、呼び出しプロセスと同じ行のみにまたがるサブコミュニケーターのハンドルが含まれます。