- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在大量内核上调试我的程序时,我遇到了非常奇怪的虚拟内存不足
错误。我的调查导致代码和平,主人向每个奴隶发送小消息。然后我写了一个小程序,其中 1 个主机使用 MPI_SEND
发送 10 个整数,所有从机使用 MPI_RECV
接收它。比较MPI_SEND
前后的/proc/self/status
文件,内存大小的差异是巨大的!最有趣的事情(它使我的程序崩溃)是此内存不会在 MPI_Send
之后释放,并且仍然占用大量空间。
有什么想法吗?
System memory usage before MPI_Send, rank: 0
Name: test_send_size
State: R (running)
Pid: 7825
Groups: 2840
VmPeak: 251400 kB
VmSize: 186628 kB
VmLck: 72 kB
VmHWM: 4068 kB
VmRSS: 4068 kB
VmData: 71076 kB
VmStk: 92 kB
VmExe: 604 kB
VmLib: 6588 kB
VmPTE: 148 kB
VmSwap: 0 kB
Threads: 3
System memory usage after MPI_Send, rank 0
Name: test_send_size
State: R (running)
Pid: 7825
Groups: 2840
VmPeak: 456880 kB
VmSize: 456872 kB
VmLck: 257884 kB
VmHWM: 274612 kB
VmRSS: 274612 kB
VmData: 341320 kB
VmStk: 92 kB
VmExe: 604 kB
VmLib: 6588 kB
VmPTE: 676 kB
VmSwap: 0 kB
Threads: 3
最佳答案
这是几乎所有在 InfiniBand 上运行的 MPI 实现的预期行为。 IB RDMA 机制要求数据缓冲区应该被注册,即它们首先被锁定在物理内存中的一个固定位置,然后驱动程序告诉 InfiniBand HCA 如何将虚拟地址映射到物理内存。注册供 IB HCA 使用的内存非常复杂,因此过程非常缓慢,这就是为什么大多数 MPI 实现从不注销曾经注册过的内存,希望相同的内存稍后用作源或数据目标。如果注册的内存是堆内存,它永远不会返回给操作系统,这就是为什么您的数据段的大小只会增加。
尽可能重复使用发送和接收缓冲区。请记住,通过 InfiniBand 进行的通信会产生高内存开销。大多数人并没有真正考虑过这一点,而且通常没有很好的文档记录,但是 InfiniBand 使用了许多特殊的数据结构(队列),这些数据结构分配在进程的内存中,并且这些队列随着进程的数量而显着增长。在某些完全连接的情况下,队列内存量可能非常大,以至于实际上没有内存留给应用程序。
有一些参数可以控制英特尔 MPI 使用的 IB 队列。在您的案例中,最重要的是 I_MPI_DAPL_BUFFER_NUM
,它控制预分配和预注册内存的数量。它的默认值为 16
,因此您可能希望减小它。但是请注意可能的性能影响。您还可以通过将 I_MPI_DAPL_BUFFER_ENLARGEMENT
设置为 1
来尝试使用动态预分配缓冲区大小。启用此选项后,英特尔 MPI 将首先注册小缓冲区,然后在需要时增加它们。另请注意,IMPI 延迟打开连接,这就是为什么您仅在调用 MPI_Send
后才会看到已用内存大幅增加的原因。
如果不使用 DAPL 传输,例如改用 ofa
传输,您无能为力。您可以通过将 I_MPI_OFA_USE_XRC
设置为 1
来启用 XRC 队列。这应该以某种方式减少使用的内存。如果您的程序的通信图未完全连接(完全连接的程序是一个完全连接的程序,其中每个等级与所有其他等级对话)。
关于linux - MPI_SEND 占用很大一部分虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088772/
有没有一个简单的答案:为什么 GHC 这么大? OCaml:2MB Python:15MB SBCL:9MB OpenJRE - 26MB GHC:113MB 对“如果 Haskell 是正确的工具,
我发现我的 access_log 占用了我的大部分硬盘。它的大小超过 200 GB。我怎样才能重置它? 我在装有 Plesk 的 CentOS 服务器上使用 Apache 2.2.3。 谢谢你们 !
我正在使用 Java 中的 BeanShell 解释器来解决字符串计算问题。问题是我自己做了一些解释器无法完成的解析并将部分结果存储在 BigInteger 中。然后我将所有内容拼凑起来并交给解释器来
我在我的 android 项目中使用 OpenCV native 库。它是一个带有一个 CameraScreen 的 hello world 项目,它已经有 40mb。我怎样才能减少 apk 的大小,
我使用基于 Laravel 和 Vue.js 的 Laravue Dashboard,在在线服务器上运行,而不是本地主机,它是全新安装,没有进行任何编辑。 我的问题是: 运行 npm run watc
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我广泛使用了 Kendo DataSourceResult ToDataSourceResult(this IQueryable enumerable, DataSourceRequest reque
我使用 phonegap 构建 html\css 应用程序陪审团手机给我 div: 并且模拟器中的最小高度太大,我在底部看到黑线像这样: 如果我在 css 文件中更改 min-height: 736
以下工作正常但速度太慢。只需要知道B表中有匹配的记录,有什么技巧吗? (奇怪的是相反的搜索:找到不加入的记录(IS NULL)非常快) SELECT TableA.id FROM TableA
我正在使用 Vue.js,我的项目中只有 4 个组件。 我只导入了bootstrap、jquery 和lodash: import { map } from 'lodash'; import 'boo
我有 2 个字谜检测功能;一个使用排序和比较,另一个跟踪每个字母字符出现的次数。 这里假设传递给函数的两个字符串是相同的,第一个随机生成(未排序),第二个 = 给第一个,这样两个函数都“一路”执行并返
我正在尝试编写一个脚本,该脚本将通过 HTTP 同时下载最多 N 个文件。 我以前用过 AnyEvent::Worker::Pool管理阻塞任务池。我也用过 AnyEvent::HTTP结合AnyEv
我是一名优秀的程序员,十分优秀!