14

使用时MPI_IsendMPI_Request参数是否可以为空指针(当发送方不关心消息发送后)?

4

1 回答 1

30

简短的回答是否定的 - 请求句柄参数不能NULL

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

  • 阻止并等待操作完成与MPI_Wait()朋友
  • 与朋友一起测试操作是否完成,MPI_Test()直到测试结果为阳性
  • 释放手柄MPI_Request_free()

一旦请求完成,等待和测试功能都会释放请求。您也可以在它返回后立即释放它MPI_Isend()。这不会取消操作,而是在完成后立即标记删除请求。但是,您将无法获得发送操作的状态。

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

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

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

于 2012-06-04T15:08:34.180 回答