在我的mpi程序中,每个进程都有一个或一组数据:
char *datablock;
块类似但不相同大小。
将这些块从每个进程分发到另一个进程的最佳方式(使用的功能和方式)是什么? 最后,我希望每个进程都有(可能)所有块的数组:
char **blockarray;
这样
*blockarray[i] // for i in [0... number_of_processes-1]
是第i个过程的前一个块。 但重要的不是订单,"我"不必是进程ID,订单可以在每个进程上有所不同(如果这更快)! 我只想以最快的方式获得每个线程上的每个块。
答案 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);