openMP:并行运行所有线程会导致内存不足异常
Posted
技术标签:
【中文标题】openMP:并行运行所有线程会导致内存不足异常【英文标题】:openMP: Running with all threads in parallel leads to out-of-memory-exceptions 【发布时间】:2019-10-02 09:40:18 【问题描述】:我想缩短冗长的图像处理算法的运行时间,该算法通过使用 openMP 的并行处理应用于多个图像。
该算法适用于单个或有限数量 (=2) 的线程。
但是:使用 openMP 进行并行处理需要大量内存,在以最大可能线程数运行时会导致内存不足异常。
为了解决这个问题,我将 “抛出异常” 替换为 “等待空闲内存”,以防内存不足,导致很多 (@987654321 @) 线程正在等待空闲内存...
是否有任何解决方案/工具/方法可以根据可用内存动态维护内存或启动线程?
【问题讨论】:
如果你的单线程工作正常,那么为什么多线程版本应该使用更多的内存?这听起来像是一个设计问题。我们需要更多细节和工作示例才能为您提供帮助。 如果您没有足够的内存来一次处理多张图像,请并行处理您的算法以处理单张图像。 如果这真的只是将 omp 并行包装为您的整个代码,为什么不直接使用 shell(或者,更好的是 Python)脚本来并行运行多个进程!? 【参考方案1】:尝试将您的程序编译为 64 位。 32 位程序最多只能有 2^32 = 大约 4GB 的内存。 64 位程序可以使用更多(2^64,即 18 艾字节)。现在很容易达到 4GB 内存。
请注意,如果您使用的 RAM 超出可用内存,您的操作系统将不得不将一些内存分页到磁盘。这会严重影响性能。如果您到了这一点(您使用了很大一部分 RAM)并且仍然有额外的内核,您将不得不更深入地研究算法以找到更细粒度的部分以进行并行化。
如果您由于某种原因无法切换到 64 位,您可以进行多处理(运行一个程序的多个实例),这样每个进程将拥有高达 4GB 的空间。您将需要以某种方式启动和协调流程。根据您的需要,这可能意味着使用简单的命令行参数或复杂的进程间通信 (IPC)。 OpenMP 不做 IPC,但 Open MPI 做。 Open MPI 通常用于网络上多个节点之间的通信,但可以将其设置为在一台机器上运行并发实例。
【讨论】:
感谢您的指出。我已经是64位了。在尝试让 28 个内核保持忙碌时,我的内存超过了 68GB .....以上是关于openMP:并行运行所有线程会导致内存不足异常的主要内容,如果未能解决你的问题,请参考以下文章
Flink on Yarn 提交任务由于内存不足产生的异常调试