在我的代码中,我定义了一个新的 MPI 用户定义数据类型。我想知道 MPI_Barrier 函数是否必须遵循 MPI_Commit 或必须放置在首次使用新数据类型的某个点,以便所有进程都确认并同意新数据类型的定义。
谢谢。
在我的代码中,我定义了一个新的 MPI 用户定义数据类型。我想知道 MPI_Barrier 函数是否必须遵循 MPI_Commit 或必须放置在首次使用新数据类型的某个点,以便所有进程都确认并同意新数据类型的定义。
谢谢。
不 - MPI_Type 命令中没有通信,它们完全是本地的。特别是,流程不一定要就新类型的定义达成一致。
如果 rank 1 向 rank 0 发送一个新的数据类型,他们所要同意的只是数据量,而不是类型的布局。例如,假设排名 1 正在将其所有(例如,2d)本地数组发送到排名 0 - 它可能只是选择发送 NX*NY 浮点数的 MPI_Type_contiguous。但是等级 0 可能会将其接收到更大的全局数组中;它可能会选择将其接收到全局类型的 Subarray 类型中。即使这些数据类型具有相同的名称,它们也可以描述内存中不同的最终布局,只要数据总量相同。
MPI 数据类型是创建它们的进程的私有业务。它们不需要匹配,事实上,接收进程使用与发送进程不同的类型映射是可能且完全合法的(只要它当然不会导致内存损坏)。因此,使用Define
or时没有任何同步Commit
。