如以下定义所示,MPI_Bsend() 是一个阻塞 MPI 函数。但这违背了我们对“封锁”一词的普遍理解。因此出现了以下问题:形容词“阻塞”和“非阻塞”在描述 MPI 函数时是否有任何帮助?如果不是,为什么它们会出现在术语中?
根据标准定义阻塞和非阻塞 MPI 过程:
如果 MPI 过程是不完整并且是本地,则它是非阻塞。
如果 MPI 过程不是 非阻塞,则它是 阻塞。
本地和非本地 MPI 程序的定义:
如果可能需要返回,则 MPI 过程是非本地,在其期间 执行,一些特定的语义相关的 MPI 过程被另一个调用 MPI 流程。
如果 MPI 过程不是 非本地,则它是 本地。
不完整和完整程序的定义:
如果 MPI 过程不是 完成,则称为 不完整 程序。
如果从过程返回表明至少一个关联操作已完成其完成阶段,则 MPI 过程称为“完成”,这意味着用户可以依赖输出数据缓冲区的内容并修改输入和输出的内容此类操作的数据缓冲区。如果完成过程不是释放过程,则不允许用户取消分配数据缓冲区或修改数组参数。
因此,在 MPI 中,完整性和局部性的概念比阻塞/非阻塞概念更为基本。但为什么后者会存在呢?
之所以存在这些概念,是因为大多数函数都可以被描述为非阻塞或阻塞,它本质上是一种简写。
现在为什么
BSend
被视为阻塞?
它是complete,因为调用rank可以在函数完成后对其传递给函数的缓冲区执行任何它想要的操作。修改是合法的。 它是本地,因为不需要其他操作来完成操作。 将此与
ISend
进行对比,其中函数返回很快,但发送缓冲区可能尚未使用或释放,并且需要等待状态。
那么这个概念有用吗?我想说这就是有用处:这是推理程序正确性的有用概念。