openMP:并行运行所有线程会导致内存不足异常

时间:2019-10-02 09:40:18

标签: c++ multithreading openmp

我想缩短冗长的图像处理算法的运行时间,该算法通过与openMP并行处理而应用于多个图像。

该算法在单个或有限数量(= 2)的线程上工作正常。

但是:使用openMP进行并行处理需要大量内存,当以尽可能多的线程数运行时,会导致内存不足异常。

为解决此问题,我将“抛出异常” 替换为“等待可用内存” ,以防内存不足,导致很多({{ 1}})线程正在等待可用内存...

是否有任何解决方案/工具/方法可以根据可用内存动态维护内存或启动线程?

1 个答案:

答案 0 :(得分:0)

尝试编译64位程序。 32位程序最多只能有2 ^ 32 =大约4GB的内存。 64位程序可以使用更多的内存(2 ^ 64,即18艾字节)。这几天很容易达到4GB的内存。

请注意,如果您使用的RAM超出了可用的内存,则OS必须将一些内存分页到磁盘。这会严重影响性能。如果到了这一点(您正在使用大量的RAM)并且仍然有额外的内核,则必须更深入地研究算法以找到更细粒度的部分来进行并行化。

如果由于某种原因而无法切换到64位,则可以执行多处理(运行程序的多个实例),以便每个进程最多可拥有4GB。您将需要以某种方式启动和协调流程。根据您的需求,这可能意味着使用简单的命令行参数或复杂的进程间通信(IPC)。 OpenMP不执行IPC,但Open MPI可以。开放式MPI通常用于网络上许多节点之间的通信,但可以将其设置为在一台计算机上运行并发实例。

相关问题