C MPI_Isend请求参数

C MPI_Isend请求参数,c,mpi,C,Mpi,当使用MPI\u Isend时,MPI\u请求参数是否可以是空指针(当发送方不关心发送后的消息)?简短回答是否-请求句柄参数不能是null MPI_Isend()启动异步发送操作。所有异步操作都有一个请求句柄,以后必须通过以下方式之一对其进行操作: 使用MPI\u wait()和friends()阻止并等待操作完成 使用MPI\u test()和朋友测试操作是否完成,直到测试结果为阳性 使用MPI\u Request\u free()释放句柄 等待和测试功能都会在请求完成后释放请求。您还可以

当使用
MPI\u Isend
时,
MPI\u请求
参数是否可以是空指针(当发送方不关心发送后的消息)?

简短回答是否-请求句柄参数不能是
null

MPI_Isend()
启动异步发送操作。所有异步操作都有一个请求句柄,以后必须通过以下方式之一对其进行操作:

  • 使用
    MPI\u wait()
    和friends()阻止并等待操作完成
  • 使用
    MPI\u test()
    和朋友测试操作是否完成,直到测试结果为阳性
  • 使用
    MPI\u Request\u free()释放句柄
等待和测试功能都会在请求完成后释放请求。您还可以在通过
MPI\u Isend()
返回后立即释放它。这不会取消操作,而是在完成后立即标记删除请求。但是,您将无法获取发送操作的状态

如果您不关心异步操作的结果(例如,完成状态、消息接收状态、错误代码等),正确的做法如下:

MPI_Request req;
...
MPI_Isend(..., &req);
MPI_Request_free(&req);
...

警告:这适用于异步发送,因为可以设计另一种方法来验证发送操作是否已完成,例如,目标进程可能在收到消息后响应。但是,不应该释放异步接收请求,而应该等待或测试完成,因为无法知道操作何时完成。

试试看?如果不能,应该给出一个segfault。好的,我试过了,答案是否定的:MPI检查请求指针是否为空,否则会打印一个错误。这是正确的。我只想补充一点,一个人必须以某种方式完成一个
MPI\u请求
。MPI实现可以将发送消息的实际工作推迟到
MPI_Wait
(或等效)调用。如果请求已启动但从未完成,则消息可能永远不会发送。谢谢!我扩展了“结果”一词,以更好地反映我的想法。