mpi收集数据

mpi收集数据,mpi,collect,Mpi,Collect,我确信MPI\u Gather从所有进程收集数据,包括根进程本身 如何使MPI\u聚集从所有进程(不包括根进程本身)收集数据? 或者是否有其他功能?使用MPI\u Gatherv复制MPI\u Gatherv的功能,但指定0作为根列组的块大小。大概是这样的: int秩,大小,disp=0; int*cnts,*显示; MPI_通信大小(MPI_通信世界和大小); cnts=malloc(大小*sizeof(int)); disfs=malloc(大小*sizeof(int)); 对于(秩=0;秩

我确信
MPI\u Gather
从所有进程收集数据,包括根进程本身

如何使
MPI\u聚集
从所有进程(不包括根进程本身)收集数据?
或者是否有其他功能?

使用
MPI\u Gatherv
复制
MPI\u Gatherv
的功能,但指定
0
作为根列组的块大小。大概是这样的:

int秩,大小,disp=0;
int*cnts,*显示;
MPI_通信大小(MPI_通信世界和大小);
cnts=malloc(大小*sizeof(int));
disfs=malloc(大小*sizeof(int));
对于(秩=0;秩
请注意,
MPI\u-Gatherv
可能比
MPI\u-Gather
慢得多,因为MPI实现很可能无法优化通信路径,并且会退回到一些收集操作的哑线性实现。因此,仍然使用
MPI\u Gather
并在根进程中提供一些虚拟数据可能是有意义的

您还可以提供
MPI_IN_PLACE
作为根进程发送缓冲区的值,并且它不会将数据发送到自身,但是您必须在接收缓冲区中为根数据保留位置(就地操作期望根将其数据直接放在接收缓冲区内的正确位置):


使用
MPI\u Gatherv
复制
MPI\u Gatherv
的功能,但将
0
指定为根列组的块大小。大概是这样的:

int秩,大小,disp=0;
int*cnts,*显示;
MPI_通信大小(MPI_通信世界和大小);
cnts=malloc(大小*sizeof(int));
disfs=malloc(大小*sizeof(int));
对于(秩=0;秩
请注意,
MPI\u-Gatherv
可能比
MPI\u-Gather
慢得多,因为MPI实现很可能无法优化通信路径,并且会退回到一些收集操作的哑线性实现。因此,仍然使用
MPI\u 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);