C、openMPI : What is the best way to distribute blocks of data from each process to all other processes?

标签 c mpi openmpi

在我的 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/

相关文章:

在 c 中使用 #if 创建程序模式

c - 没有打印出任何字母?

c - 程序有时会出现段错误,但并非总是如此。我该如何纠正它?

c++ - 在 C/C++ 中允许有符号整数溢出

python - 在 mpi4py 中接收腌制项目的非阻塞方式

c++ - MPI 和标准输入开销?

linux - fork: retry: 资源暂时不可用

c++ - 当接收方不发布接收时标准和非阻塞发送会发生什么

macos - 如何在 Homebrew 软件上构建带有 mpi 支持的 boost?

mpi - mpirun 的自定义中断处理程序