4

我使用 MPI 并行化了 Fortran 代码。在共享点,我使用 MPI_Isend 从模型中的所有进程将所有数据发送到缓冲区。然后,每个进程使用 MPI_Recv 收集它需要的数据。由于 MPI_Recv 是阻塞的,我知道每个进程在继续计算之前都在获取它需要的数据。因此,我只是忽略了 MPI_Isend 给我的请求代码。我将它设置为一些我不保留的整数。我从不调用 MPI_Wait。当我运行我的代码时,我注意到它在每次迭代时都会占用更多的内存,我想知道是不是因为我没有调用 MPI_Wait,因为在文档中,MPI_Wait 说:

如果与此请求关联的通信对象是由非阻塞发送或接收调用创建的,则通过调用 MPI_WAIT释放对象 ,并将请求句柄设置为 MPI_REQUEST_NULL。

你认为这就是我的程序在整个运行过程中消耗更多内存的原因吗?

4

1 回答 1

4

MPI_Request与 MPI 通信功能(例如您的)相关联的MPI_ISend将被分配内存,并且必须通过 MPI(而不是 )进行清理delete

在发生以下 3 件事之一之前,不会归还内存:

  • 等待MPI_Wait请求完成,释放它。
  • 一个MPI_Test返回成功,也释放它。
  • 使用 释放请求MPI_Request_free

可以释放一个活动的请求(即一个MPI_Request未完成传输的消息),该请求将继续发送,但MPI_Request对于任何用途(如测试、等待等)将不再有效。

于 2013-08-03T13:48:37.367 回答