有没有办法取消阻塞的'MPI_Probe'调用?

有没有办法取消阻塞的'MPI_Probe'调用?,mpi,Mpi,MPI\u-Irecv和MPI-Isend操作返回一个MPI\u请求,该请求可在以后用MPI\u-Cancel标记为已取消。是否有类似的机制来阻止MPI\u探针和MPI\u探针 问题的背景是使用Probe的最新实现 编辑-以下是如何使用假设的MPI\u Probecancel的示例: #包括 #包括 #包括 使用名称空间std::literals::chrono_literals; //在线程中执行 无效异步\u取消(MPI\u探测*探测) { std::this_线程::sleep_for(

MPI\u-Irecv
MPI-Isend
操作返回一个
MPI\u请求
,该请求可在以后用
MPI\u-Cancel
标记为已取消。是否有类似的机制来阻止
MPI\u探针
MPI\u探针

问题的背景是使用Probe的最新实现


编辑-以下是如何使用假设的
MPI\u Probecancel
的示例:

#包括
#包括
#包括
使用名称空间std::literals::chrono_literals;
//在线程中执行
无效异步\u取消(MPI\u探测*探测)
{
std::this_线程::sleep_for(1s);
int res=MPI_Probecancel(探针);
}
int main(int argc,char*argv[])
{
提供int;
MPI_Init_线程(&argc,&argv,MPI_线程多个,&provided);
如果(秩==0)
{
//探测器的句柄(类似于请求)
MPI_探头;
//开线
//“probe”将充满下一个电话,非常难看
//理想情况下,这应该通过两个步骤完成,如MPI\u Irecv、MPI\u Wait
auto res=std::async(std::launch::async,&async\u cancel,&probe);
MPI_消息;
MPI_状态;
MPI_MProbe(1123,MPI_通信世界、消息、状态和探测);
如果(!探测已取消)
{
int缓冲区;
MPI_Mrecv(缓冲区、1、MPI_INT、消息和状态);
}
}
其他的
std::this_线程::sleep_for(2s);
MPI_Finalize();
返回0;
}

首先,你的问题的前提/术语是错误的。它是非阻塞调用
MPI\u-Irecv
MPI-Isend
返回一个您可以取消的请求对象。对于这些调用,您可以取消本地操作

MPI\u探头
MPI\u探头
实际上是阻塞。您不可能取消这些操作,因为控制流只有在消息可用时才会离开

另一方面,
MPI_Iprobe
MPI_Improbe
非阻塞的,这意味着它们总是立即完成,告诉您消息是否可用

对于这两种类型的探测调用,在完成后都会留下任何类型的本地状态。因此,在函数返回后,没有任何东西可以在本地取消

这就是说,如果探测器告诉您消息可用,您肯定会收到它。否则发送操作可能会出错,您将泄漏所有方面的资源。但那只是一个接收操作

编辑:关于在并发线程中取消正在进行的本地
MPI\u探测的想法:这是不直接支持的

理论上,您可以通过在
MPI\u ANY\u SOURCE
上运行探测,并从另一个线程向相同列组发送消息,在具有
MPI\u THREAD\u MULTIPE
的一致性实现上模拟这一点。当然,这样做的结果是,您必须对来自任何传入列组的消息进行更改

实际上,如果必须这样做,您可能只需要使用一个循环,如
while(!cancelled)MPI_Iprobe()

这就是说,我会再次质疑这个场景:你队伍中的另一个线程怎么会突然知道取消本地
MPI\u探测操作?它可能必须基于从远程队列接收到的信息——在这种情况下,实际能够从远程队列接收到信息,即实际的探测将完成


也许对于一些高级抽象来说,提供本地取消是有意义的,但在实际情况中,我相信您可以设计一个惯用模式而不需要它。

谢谢@Zulan,我编辑了这个问题来解决命名问题(混合C和Boost.MPI API)。“您不可能取消这些操作,因为控制流只有在消息可用时才会离开“.这不应该被视为一个设计问题吗?对于序列
MPI\u Irecv
-
MPI\u Wait
我们有一个取消选项,但是对于
MPI\u Mprobe
-
MPI\u Mrecv
我们没有?您认为取消探测的语义应该是什么意思?也许只是“停止探测”?如果有一个线程在循环中调用
MPI\u-Mprobe
MPI\u-Mrecv
,如果我被锁定在
MPI\u-Mprobe
中而无法取消主线程的探测,我如何退出该线程?但可能不是典型的用例……那么,当所讨论的线程卡在
MPI(M)探测中时,哪个线程/进程将调用虚构的
MPI_Probecancel