MPI_Gather
ルートプロセス自体を含むすべてのプロセスからデータを収集することを確信しました。
MPI_Gather
ルートプロセス自体を含まないすべてのプロセスからデータを収集するにはどうすればよいですか?または、代替機能はありますか?
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);