0

我有一个使用 openmp 并行构造的 c++ 应用程序。

for 循环内部的方法会占用大量内存。它在开始时分配内存并在结束时释放它们。

如果系统有足够的内存,它工作得很好,但如果没有足够的内存,操作就会失败。

目标系统可能有足够的内存,因此只能并行运行 2 个线程,或者可以并行运行 3 个线程。

有没有办法配置openmp,所以它知道它应该根据可用内存使用多少线程?

如果 OpenMP 无法做到这一点,我有什么办法可以自己做到这一点?

4

1 回答 1

1

OpenMP 在监控内存使用方面非常愚蠢,您必须自己实现它。一个好的策略是获取可用内存量,然后将其除以每个线程的内存需求,以获得可以同时处理数据的线程数的上限。一旦知道该数字,您就可以使用以下子句强制该parallel区域使用那么多线程运行:num_threads

int max_threads = mem_size / mem_per_thread;

#pragma omp parallel for num_threads(max_threads)
for (...)
{
}

现在的难题是如何获得可用内存量,尤其是考虑到几乎所有现代操作系统都实现了虚拟内存。一种解决方案是将其留给最终用户,例如在程序配置中提供一个参数,用户可以将其设置为他认为合理的特定值。另一种策略可能是将值设置为物理内存大小的给定百分比。

于 2013-09-09T15:05:40.490 回答