Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将MPI_IProbe与MPI_Irecv一起使用_C++_Mpi_Nonblocking - Fatal编程技术网

C++ 将MPI_IProbe与MPI_Irecv一起使用

C++ 将MPI_IProbe与MPI_Irecv一起使用,c++,mpi,nonblocking,C++,Mpi,Nonblocking,我有一个代码,每个处理器都需要检查它是否有任何消息要接收(可能有多条消息),并为每条消息发送非阻塞接收。我想知道发布Irecv后,但尚未完成的MPI_Iprobe的返回值是多少。i、 e: MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status); while(flag) { MPI_Get_count(&status, MPI_DOUBLE, &count); MP

我有一个代码,每个处理器都需要检查它是否有任何消息要接收(可能有多条消息),并为每条消息发送非阻塞接收。我想知道发布Irecv后,但尚未完成的MPI_Iprobe的返回值是多少。i、 e:

MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
while(flag)
{
   MPI_Get_count(&status, MPI_DOUBLE, &count);
   MPI_Irecv(&Receive_buffer[index], count, MPI_DOUBLE, status.MPI_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, &Request[index]);
   MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
}

现在,我相信在MPI_Irecv完成之前,MPI_Iprobe将返回true。是否有办法让探测器继续处理需要接收的任何其他消息?每个进程都不知道要事先检查多少条消息,所以我不能只使用几个MPI_探测器。

在这种情况下使用Irecv有什么原因吗?如果iprobe告诉您消息可用,Recv应该或多或少立即返回,这似乎可以简化对此的推理。非阻塞读取和探测在过去有过竞争条件(例如,因此),我在标准中没有看到任何关于何时Irecv应该完成“足够”以使Iprobe返回false的明确指导。(除了等待之后,在这种情况下,您最好使用Recv)。Hristo对相关(但我认为不完全重复)问题的出色回答对于本次讨论非常有用。我使用非阻塞发送、非阻塞接收和直接放置在我发布的代码后的Waitall。我希望MPI决定接收消息的顺序,而不是强制它按消息的顺序接收(使用Iprobe阻止接收)。如果我使用阻塞接收,处理器之间的时间差会导致接收挂起(我已经尝试过了)。我想一个更好的问题是:如果需要接收消息而尚未发布接收消息,是否有MPI函数返回true?我认为在这种情况下,Recv和Irecv之间不会有任何性能差异-消息已经可以接收。正如赫里斯托的回答所指出的那样,没有明确的标准来衡量何时一个接收已经完成了“足够”以使一条信息从争论中消失,从而使iprobe返回真实;事实上,考虑到MPI实现所使用的各种网络传输和进度引擎,很难看出它们是如何工作的。另一方面,MProbe做了一些您想要做的事情,因为一旦消息被标记,它就不会再被标记。问题是消息已经准备好在接收端接收,但发送方可能还没有准备好(因为它也在发布、接收或已经开始做其他工作)。我会调查这件衣服的。