MPI_探针与MPI_探针
在MPI_Iprobe中,需要多次检查标志,以确定是否存在任何消息,一种方法是将其放入while循环中,我想知道这种方法是否等同于MPI_Probe 因为它基本上以不同的方式阻止了探测, 这是使用Iprobe的错误方式吗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
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
,我确实假设这是在知道大小之前完成的。这只是一个简单的测试用例,事实上我不知道现在是最大尺寸,因为它会根据计算进行更改,不过谢谢您的宝贵意见