MPI_Isend请求参数

sun*_*mat 12 c mpi

使用时MPI_Isend,MPI_Request参数可以是空指针(当发送者发送后不关心消息时)?

Hri*_*iev 26

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

MPI_Isend()启动异步发送操作.所有异步操作都有一个请求句柄,必须在以下某种方式之后执行:

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

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

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

MPI_Request req;
...
MPI_Isend(..., &req);
MPI_Request_free(&req);
...
Run Code Online (Sandbox Code Playgroud)

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

  • 这是对的.我只是想补充说,有一个原因必须以某种方式完成一个`MPI_Request`.MPI实现可以将发送消息的实际工作推迟到"MPI_Wait"(或等效)调用.如果请求已启动且从未完成,则可能永远不会发送该消息. (2认同)