MPI_Type_commit 是不是隐式调用 MPI_COMM_WORLD 中所有进程的屏障?

Posted

技术标签:

【中文标题】MPI_Type_commit 是不是隐式调用 MPI_COMM_WORLD 中所有进程的屏障?【英文标题】:Does MPI_Type_commit implicitly call a barrier on all the processes in MPI_COMM_WORLD?MPI_Type_commit 是否隐式调用 MPI_COMM_WORLD 中所有进程的屏障? 【发布时间】:2012-04-03 05:38:08 【问题描述】:

在我的代码中,我定义了一个新的 MPI 用户定义数据类型。 我想知道 MPI_Barrier 函数是否必须遵循 MPI_Commit 或必须放置在首次使用新数据类型的某个点,以便所有进程都确认并同意新数据类型的定义。

谢谢。

【问题讨论】:

【参考方案1】:

否 - MPI_Type 命令中没有通信,它们完全是本地的。特别是,进程不一定必须就新类型的定义达成一致。

如果 rank 1 向 rank 0 发送一个新的数据类型,他们所要同意的只是数据量,而不是类型的布局。例如,假设排名 1 正在将其所有(例如,2d)本地数组发送到排名 0 - 它可能只是选择发送 NX*NY 浮点数的 MPI_Type_contiguous。但是等级 0 可能会将其接收到更大的全局数组中;它可能会选择将其接收到全局类型的 Subarray 类型中。即使这些数据类型有相同的名称,它们也可以描述内存中不同的最终布局,只要数据总量相同。

【讨论】:

【参考方案2】:

MPI 数据类型是创建它们的进程的私有业务。它们不需要匹配,事实上,接收进程使用与发送进程不同的类型映射是可能且完全合法的(只要它当然不会导致内存损坏)。因此,在使用DefineCommit 时,没有任何同步。

【讨论】:

以上是关于MPI_Type_commit 是不是隐式调用 MPI_COMM_WORLD 中所有进程的屏障?的主要内容,如果未能解决你的问题,请参考以下文章