如果我不将 MPI_Isend 与 MPI_Wait 配对,我的程序是不是需要增加内存量?

Posted

技术标签:

【中文标题】如果我不将 MPI_Isend 与 MPI_Wait 配对,我的程序是不是需要增加内存量?【英文标题】:Will my program require increasing amounts of memory if I don't pair my MPI_Isend's with MPI_Wait?如果我不将 MPI_Isend 与 MPI_Wait 配对,我的程序是否需要增加内存量? 【发布时间】:2013-08-04 04:12:42 【问题描述】:

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

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

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

【问题讨论】:

是的。 slideshare.net/jsquyres/…. 谢谢。我想我现在需要想出一个系统来存储/检索请求代码。 【参考方案1】:

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

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

诸如MPI_Wait 之类的等待在请求上完成,释放它。 MPI_Test 返回成功,同时释放它。 使用MPI_Request_free 释放请求。

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

【讨论】:

是的,我更改了我的数据共享系统以存储请求代码,并对 MPI_Wait 进行必要的调用以释放内存。我的代码现在在整个模拟过程中使用恒定数量的内存,而不是吃掉集群上的每一点 RAM。

以上是关于如果我不将 MPI_Isend 与 MPI_Wait 配对,我的程序是不是需要增加内存量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥如果我不将 csrf_field() 放在表单的末尾(在 Laravel 5 视图中)我会获得 TokenMismatchException?

收到的关于 MPI_Isend 的数据不一致

如何强制 div 位于视口的顶部/底部,同时不将其从文档流中取出?

MPI_Isend 和 MPI_Irecv 似乎导致了死锁

Microsft MPI MPI_Isend 中的死锁

可笑的简单 MPI_Send/Recv 问题我不明白