0

MPI_Gatherルートプロセス自体を含むすべてのプロセスからデータを収集することを確信しました。

MPI_Gatherルートプロセス自体を含まないすべてのプロセスからデータを収集するにはどうすればよいですか?または、代替機能はありますか?

4

1 に答える 1

6

MPI_Gatherを使用する機能を複製しますが、代わりにルートランクのチャンクサイズとしてMPI_Gatherv指定します。0このようなもの:

int rank, size, disp = 0;
int *cnts, *displs;

MPI_Comm_size(MPI_COMM_WORLD, &size);

cnts = malloc(size * sizeof(int));
displs = malloc(size * sizeof(int));
for (rank = 0; rank < size; rank++)
{
    cnts[i] = (rank != root) ? count : 0;
    displs[i] = disp;
    disp += cnts[i];
}

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Gatherv(data, cnts[rank], data_type,
            bigdata, cnts, displs, data_type,
            root, MPI_COMM_WORLD);

free(displs); free(cnts);

これは、MPI実装が通信パスを最適化できず、収集操作のダム線形実装にフォールバックする可能性が高いため、MPI_Gatherv大幅に遅くなる可能性があることに注意してください。したがって、ルートプロセスでダミーデータをMPI_Gather使用して提供することは理にかなっているかもしれません。MPI_Gather

ルートプロセスの送信バッファの値として指定することもできますMPI_IN_PLACEが、それ自体にはデータが送信されませんが、受信バッファ内のルートデータ用の場所を予約する必要があります(インプレース操作では、ルートがデータを受信バッファ内の正しい位置に直接配置します):

if (rank != root)
    MPI_Gather(data, count, data_type,
               NULL, count, data_type, root, MPI_COMM_WORLD);
else
    MPI_Gather(MPI_IN_PLACE, count, data_type,
               big_data, count, data_type, root, MPI_COMM_WORLD);
于 2012-11-29T08:48:40.057 に答える