为什么 MPI_Bsend() 是一个阻塞函数?

问题描述 投票:0回答:1

如以下定义所示,MPI_Bsend() 是一个阻塞 MPI 函数。但这违背了我们对“封锁”一词的普遍理解。因此出现了以下问题:形容词“阻塞”和“非阻塞”在描述 MPI 函数时是否有任何帮助?如果不是,为什么它们会出现在术语中?

根据标准定义阻塞和非阻塞 MPI 过程:

如果 MPI 过程是不完整并且是本地,则它是非阻塞

如果 MPI 过程不是 非阻塞,则它是 阻塞

本地和非本地 MPI 程序的定义:

如果可能需要返回,则 MPI 过程是非本地,在其期间 执行,一些特定的语义相关的 MPI 过程被另一个调用 MPI 流程。

如果 MPI 过程不是 非本地,则它是 本地

不完整和完整程序的定义:

如果 MPI 过程不是 完成,则称为 不完整 程序。

如果从过程返回表明至少一个关联操作已完成其完成阶段,则 MPI 过程称为“完成”,这意味着用户可以依赖输出数据缓冲区的内容并修改输入和输出的内容此类操作的数据缓冲区。如果完成过程不是释放过程,则不允许用户取消分配数据缓冲区或修改数组参数。

因此,在 MPI 中,完整性和局部性的概念比阻塞/非阻塞概念更为基本。但为什么后者会存在呢?

mpi blocking nonblocking hpc
1个回答
1
投票
标准(4.1,pdf)

中作为第 15 页的“给用户的建议”进行了解释:

给用户的建议。请注意,对于与操作相关的 MPI 过程,大多数情况下 不完整的过程是局部的,而完成的过程是非局部的。例外情况 在定义此类程序的地方注明

之所以存在这些概念,是因为大多数函数都可以被描述为非阻塞或阻塞,它本质上是一种简写。

现在为什么
BSend

被视为阻塞?

它是

complete

,因为调用rank可以在函数完成后对其传递给函数的缓冲区执行任何它想要的操作。修改是合法的。 它是本地,因为不需要其他操作来完成操作。 将此与

ISend

进行对比,其中函数返回很快,但发送缓冲区可能尚未使用或释放,并且需要等待状态。


那么这个概念有用吗?我想说这就是有用处:

阻塞/非阻塞描述了调用级别的职责。

这是推理程序正确性的有用概念。

© www.soinside.com 2019 - 2024. All rights reserved.