在我的 mpi 程序中,每个进程都拥有或使用一个数据 block :
char *datablock;
block 的大小相似但不相同。
将这些 block 从每个进程分发到其他进程的最佳方式是什么(使用哪些函数以及如何使用)? 最后我希望每个进程都有(也许)所有 block 的数组:
char **blockarray;
这样
*blockarray[i] // for i in [0... number_of_processes-1]
是第 i 个进程的前一个 block 。 但重要的不是顺序,“i”不必是进程 ID,每个进程的顺序可以不同(如果这样更快)! 我只想以最快的方式在每个线程上获取每个 block 。
最佳答案
你应该使用 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);
关于C、openMPI : What is the best way to distribute blocks of data from each process to all other processes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924582/