C、 openMPI:将数据块从每个进程分发到所有其他进程的最佳方式是什么?

C、 openMPI:将数据块从每个进程分发到所有其他进程的最佳方式是什么?,c,mpi,openmpi,C,Mpi,Openmpi,在我的mpi程序中,每个进程都有或使用一个数据块: char *datablock; 块的大小相似,但不相同 将这些块从每个进程分配到另一个进程的最佳方式是什么(使用哪些函数以及如何分配)? 最后,我希望每个进程(可能)都有一个包含所有块的数组: char **blockarray; 所以 *blockarray[i] // for i in [0... number_of_processes-1] 是第i个过程的前一个块。 但顺序并不重要,“i”不必是进程id,每个进程的顺序可能不同(如

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

char *datablock;
块的大小相似,但不相同

将这些块从每个进程分配到另一个进程的最佳方式是什么(使用哪些函数以及如何分配)? 最后,我希望每个进程(可能)都有一个包含所有块的数组:

char **blockarray;
所以

*blockarray[i] // for i in [0... number_of_processes-1]
是第i个过程的前一个块。 但顺序并不重要,“i”不必是进程id,每个进程的顺序可能不同(如果这更快的话)!
我只想以最快的方式获取每个线程上的每个块。

您应该使用
MPI\u Allgatherv
查看以下文档:

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

您不需要
char*数据块
您只需要
char**blockarray
每次需要同步调用的数据时
MPI\u 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);

谢谢,这看起来正是我要找的。但有一个问题:在使用Allgatherv“填充”那些“空”块之前,我是否需要对其他块进行malloc?正常情况下,仅在第i个进程上*blockarray[i]是一个数据块,在我的情况下,其他blockarray[i]将指向NULL。是的,在使用
MPI\u ALLgatherv
之前,您需要分配内存,否则您将出现分段错误。尽管在初始化
display
时暗示,
blockarray[]
是否应该保存指向连续放置的内存区域的指针,这些区域之间没有间隙,例如,大平面块内的指针,这一点并不明显。此外,MPI标准明确禁止在发送和接收时使用相同的内存区域(
blockarray[id]
)-对于这种情况,有一种特殊的就地模式(
MPI\u in\u place
),并在您链接到的手册页面中进行了说明。