我使用MPI并行化Fortran代码。在共享点,我使用模型中所有进程的MPI_Isend将所有数据发送到缓冲区。然后,每个进程使用MPI_Recv进行并收集所需的数据。由于MPI_Recv是阻塞的,我知道每个进程在继续计算之前都会获得所需的数据。因此,我只是忽略了MPI_Isend给我的请求代码。我把它设置为一些我不保留的整数。我从不打电话给MPI_Wait。当我运行我的代码时,我注意到它在每次迭代时吞噬了更多内存,我想知道是不是因为我没有调用MPI_Wait,因为在文档中,MPI_Wait说:
如果创建了与此请求关联的通信对象 通过非阻塞发送或接收呼叫,该对象解除分配 通过调用MPI_WAIT并将请求句柄设置为 MPI_REQUEST_NULL。
你认为这就是为什么我的程序在整个运行过程中会占用更多内存的原因吗?
答案 0 :(得分:4)
与MPI_Request
等MPI通信功能相关联的MPI_ISend
将被分配内存,并且必须通过MPI清除(而不是delete
)。
在发生以下三种情况之一之前,不会回复记忆:
MPI_Wait
之类的等待在请求上完成,释放它。MPI_Test
会恢复成功,也会释放它。MPI_Request_free
释放请求。可以释放活动请求(即MPI_Request
用于未完成传输的消息),这将继续发送,但MPI_Request
将不再适用于任何用途,例如作为测试,等待等。