Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
MPI_探针与MPI_探针_Mpi - Fatal编程技术网

MPI_探针与MPI_探针

MPI_探针与MPI_探针,mpi,Mpi,在MPI_Iprobe中,需要多次检查标志,以确定是否存在任何消息,一种方法是将其放入while循环中,我想知道这种方法是否等同于MPI_Probe 因为它基本上以不同的方式阻止了探测, 这是使用Iprobe的错误方式吗 int flag=0 while(flag==0) { MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag,&status); cout<<myrank<<" "&l

在MPI_Iprobe中,需要多次检查标志,以确定是否存在任何消息,一种方法是将其放入while循环中,我想知道这种方法是否等同于MPI_Probe 因为它基本上以不同的方式阻止了探测, 这是使用Iprobe的错误方式吗

int flag=0
while(flag==0)
{
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag,&status);
cout<<myrank<<" "<<flag<<endl;
}
if(flag)
{
 MPI_Get_count(&status, MPI_INT, &count);

 MPI_Irecv(&rcvbuff,count, MPI_INT,destination.at(0),0, MPI_COMM_WORLD, &request);

}
int标志=0
while(标志==0)
{
MPI_Iprobe(MPI_任意源、MPI_任意标记、MPI_通信世界、标志和状态);

cout是的,基本上像您建议的那样围绕
MPI\u Iprobe
的循环与
MPI\u Probe
具有相同的语义。但是,您通常应该更喜欢复合操作,而不是自己实现它。。因此使用
MPI\u Probe
而不是
MPI\u Iprobe
-循环。使用
MPI\u Wait
不要使用
MPI\U测试
-循环。尽可能使用集体消息而不是单独的点对点消息

如果希望将通信与计算重叠,则同步
MPI\u I…
函数通常很有用,但不应使用它们来重新实现现有的MPI功能

通过使用
MPI\u Probe
您可以为实现提供优化和调优的自由。一方面,MPI可以阻塞直到消息出现,节省CPU周期/电源。另一方面,它可以具有较低的延迟,因为不会浪费时间一次又一次地进入MPI堆栈。这对于任何使用PMPI层t的工具来说都更好o使用一个
MPI_探测
调用,而不是数千个
MPI_Iprobe
调用。我只需将
MPI_测试
-循环替换为
MPI_Waitany
,即可在实际HPC应用程序中实现>10%的加速

唯一的例外是,如果您已经用尽了MPI实现的调优选项,并且可以肯定地表明您自己的控制盘重新实现比MPI提供的复合操作执行得更好


MPI\u-Irecv
调用也很奇怪。尽管知道已经有挂起的消息,但您是否有充分的理由使用异步接收?为什么不发布
MPI\u-Irecv
而不是首先进行探测?如果您知道分配接收缓冲区所需的最大大小,您也可以发布
MPI_Irecv
MPI\u任何源上
接收计数大于发送计数。

@DrJ您不需要知道大小,一个最大大小就足够了。因为我没有看到您在代码中分配
rcvbuff
,我确实假设这是在知道大小之前完成的。这只是一个简单的测试用例,事实上我不知道现在是最大尺寸,因为它会根据计算进行更改,不过谢谢您的宝贵意见