C,openMPI:从每个进程向所有其他进程分发数据块的最佳方法是什么?

时间:2014-09-19 00:34:27

标签: c mpi openmpi

在我的mpi程序中,每个进程都有一个或一组数据:

char *datablock;

类似不相同大小。

将这些块从每个进程分发到另一个进程的最佳方式(使用的功能和方式)是什么? 最后,我希望每个进程都有(可能)所有块的数组:

char **blockarray;

这样

*blockarray[i] // for i in [0... number_of_processes-1]

是第i个过程的前一个块。 但重要的不是订单,"我"不必是进程ID,订单可以在每个进程上有所不同(如果这更快)! 我只想以最快的方式获得每个线程上的每个块。

1 个答案:

答案 0 :(得分:2)

您应该使用MPI_Allgatherv请查看此处的文档: http://mpi.deino.net/mpi_functions/MPI_Allgatherv.html

使用此功能,您可以将每个流程的数据分发到所有其他流程。

您不需要char *datablock;您只需拥有char **blockarray;每次需要同步您拨打MPI_Allgatherv的数据时。伪代码:

id = process_id
recvcounts = [length(blockarray[0]), length(blockarray[1]), ...]
disply = [0, recvcounts[1], recvcounts[0]+recvounts[1], ...]

MPI_Allgatherv(*blockarray[id], length(*blockarray[id]), sendtype, *blockarray, *recvcounts, 
               *displs, recvtype, comm);