c++ - 如何正确使用 MPI_Scatterv()

标签 c++ c parallel-processing mpi

我在并行程序中使用 MPI_Scatterv 时遇到问题。这是它的定义方式:

int MPI_Scatterv(const void *sendbuf, const int *sendcounts,
    const int *displs, MPI_Datatype sendtype, void *recvbuf,
    int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)

据我了解,MPI_ScattervMPI_Scatter 之间的区别在于 MPI_Scatterv 段不必是相同的长度并且它们不必是连续的(允许内存中的间隙)。我不明白的部分是,如果 recvbuf 可以是每个进程的不同大小的数组,那么 recvcount 应该使用什么。假设我想将 sendbuf 的 5 个元素发送到进程 0,将 15 个元素发送到进程 1。recvcount 的值应该是多少?

最佳答案

每个进程都必须使用正确的recvcount 调用MPI_Scatterv。您可以传递一个变量,其值取决于每个进程的等级。

例如:

int recvcount = (rank == 0) ? 5 : 15;

MPI_Scatterv( sendbuf, sendcounts, displs, sendtype,
              recvbuf, recvcount, recvtype, 0, MPI_COMM_WORLD );

等级为 0 的进程调用 MPI_Scattervrecvcount5,而进程 1 传递了 15 的计数。

关于c++ - 如何正确使用 MPI_Scatterv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29329383/

相关文章:

c - 在 C 中,转换指针有开销吗?

performance - 如何基于PostgreSQL表组织工作池?

java - java中不同机器上并行运行不同的java程序

c - 如何同步多个appsink

c++ - Qt - 包含 'Utility' 函数的共享库?

c++ - 了解类模板特化示例的隐式实例化

c++ - Qt:Q_OBJECT 中的枚举没有 meta.enumeratorCount() 的元数据,为什么?

c# - 如何在 C# 中使用 p/invoke 将指针传递给数组?

c - 使用 OpenMPI 和调试提示并行计算数组的总和

c++ - PyRun_String 在任何错误后停止将结果发送到标准输出