C++ 关于boost::mpi::request,我遗漏了什么?测试似乎改变了状态

C++ 关于boost::mpi::request,我遗漏了什么?测试似乎改变了状态,c++,boost,mpi,C++,Boost,Mpi,所以我把这个简单的MPI示例放在一起。我在测试boost::mpi::request时看到一些奇怪的行为,我无法解释。特别是,如果删除第二个循环上的注释,它将永远旋转。boost::mpi::request上的测试是否只返回true一次?如果是这样,更新的状态是什么?我已经浏览了Boost的MPI和可选代码,但我无法解释我看到了什么 (当然,对于未初始化的用户,您需要使用带有两个节点的mpiexec来自行运行此功能。) #包括“stdafx.h” #包括 #包括 #包括 #包括 #包括 #包括

所以我把这个简单的MPI示例放在一起。我在测试boost::mpi::request时看到一些奇怪的行为,我无法解释。特别是,如果删除第二个循环上的注释,它将永远旋转。boost::mpi::request上的测试是否只返回true一次?如果是这样,更新的状态是什么?我已经浏览了Boost的MPI和可选代码,但我无法解释我看到了什么

(当然,对于未初始化的用户,您需要使用带有两个节点的mpiexec来自行运行此功能。)

#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
intmain(intargc,char*argv[]);
int main(int argc,char*argv[])
{
boost::mpi::environment m_env;
boost::mpi::communicator m_world;
if(m_world.rank()==0)
{
m_world.send(1,0,std::string(“hi!”);
}
其他的
{
std::shared_ptr rcv=std::shared_ptr(新std::string());
boost::mpi::request x=m_world.irecv(0,0,*rcv);
而(!x.test())
{
睡眠(10);
}
//而(!x.test())
//{
//睡眠(10);
//}

std::cout这与MPI标准一致。当指示操作已完成时,返回的状态对象将包含有关已完成操作的信息,并且操作对象本身被标记为不活动或取消分配(以适用者为准)。对该操作对象再次调用MPI_测试将返回空状态

MPI标准(最新版本)提供了一种以非破坏性方式访问状态的方法:


我不知道boost中是否实现了此操作,但您可以存储返回的
状态
对象,稍后再参考它,而不是再次调用
测试

这与MPI标准一致。当指示操作已完成时,返回的状态对象将包含以下信息:退出已完成的操作,并且操作对象本身被标记为不活动或取消分配(以适用的为准)。再次调用该操作对象上的MPI_测试将返回空状态

MPI标准(最新版本)提供了一种以非破坏性方式访问状态的方法:


我不知道boost中是否实现了此操作,但您可以存储返回的
状态
对象,稍后再参考该对象,而不是再次调用
测试。

答案在文档中,类似于:

  /**
   *  Determine whether the communication associated with this request
   *  has completed successfully. If so, returns the @c status object
   *  describing the communication. Otherwise, returns an empty @c
   *  optional<> to indicate that the communication has not completed
   *  yet. Note that once @c test() returns a @c status object, the
   *  request has completed and @c wait() should not be called.
   */
  optional<status> test();
/**
*确定与此请求关联的通信
*已成功完成。如果是,则返回@c状态对象
*描述通信。否则,返回空@c
*可选,表示通信尚未完成
*但是,请注意,一旦@c test()返回@c status对象
*请求已完成,不应调用@c wait()。
*/
可选测试();
然后看下面的例子:

如果请求标识的操作已完成,则对MPI_测试的调用将返回flag=true。在这种情况下,状态对象被设置为包含有关已完成操作的信息;如果通信对象是由非阻塞发送或接收创建的,则它将被释放,请求句柄被设置为MPI_request_NULL

允许使用null或inactive请求参数调用MPI_测试。在这种情况下,操作返回的标志为true,状态为空

因此,我们看到Boost MPI的
test()
方法返回一个
可选的
,而
MPI\u test()
只能返回一次状态(之后,请求被销毁)。
MPI\u test()
重复调用将返回
flag=true
,但这不是您要检查的。如果您确实需要此模式,您可以自己调用
MPI_Test()
并使用返回的标志而不是状态。或者只需在应用程序中记账,而不调用
boost::MPI::request::Test()
在同一请求中执行两次


看待这个问题的另一种方式是,您在布尔上下文中使用
test()
的结果,您希望它像
MPI_test()
标志一样工作,但实际上它像
状态一样工作,它的布尔性质只是一种错觉。

答案在文档中,有点:

  /**
   *  Determine whether the communication associated with this request
   *  has completed successfully. If so, returns the @c status object
   *  describing the communication. Otherwise, returns an empty @c
   *  optional<> to indicate that the communication has not completed
   *  yet. Note that once @c test() returns a @c status object, the
   *  request has completed and @c wait() should not be called.
   */
  optional<status> test();
/**
*确定与此请求关联的通信
*已成功完成。如果是,则返回@c状态对象
*描述通信。否则,返回空@c
*可选,表示通信尚未完成
*但是,请注意,一旦@c test()返回@c status对象
*请求已完成,不应调用@c wait()。
*/
可选测试();
然后看下面的例子:

如果请求标识的操作已完成,则对MPI_测试的调用将返回flag=true。在这种情况下,状态对象被设置为包含有关已完成操作的信息;如果通信对象是由非阻塞发送或接收创建的,则它将被释放,请求句柄被设置为MPI_request_NULL

允许使用null或inactive请求参数调用MPI_测试。在这种情况下,操作返回的标志为true,状态为空

因此,我们看到Boost MPI的
test()
方法返回一个
可选的
,而
MPI\u test()
只能返回一次状态(之后,请求被销毁)。
MPI\u test()
重复调用将返回
flag=true
,但这不是您要检查的。如果您确实需要此模式,您可以自己调用
MPI_Test()
并使用返回的标志,而不是状态。或者只在应用程序中记账,而不调用
boos