我有一个使用openmp并行构造的c ++应用程序。
for循环中的方法使用了大量内存。它在开始时分配内存并在最后释放它们。
如果系统有足够的内存,它运行良好,但如果内存不足,则操作失败。
目标系统可能有足够的内存,因此只能并行运行2个线程,或者可以并行运行3个线程。
有没有办法配置openmp,所以根据可用内存知道它应该使用多少线程?
如果OpenMP不能做到这一点,我有什么方法可以自己做到这一点吗?
答案 0 :(得分:1)
OpenMP在监控内存使用方面非常愚蠢,你必须自己实现它。一个好的策略是获取可用内存量,然后将其除以每个线程的内存需求,以获得可以同时处理数据的线程数的上限。一旦知道了这个数字,就可以使用parallel
子句强制num_threads
区域与多个线程一起运行:
int max_threads = mem_size / mem_per_thread;
#pragma omp parallel for num_threads(max_threads)
for (...)
{
}
现在困难的问题是如何获得可用内存量,特别是考虑到几乎所有现代操作系统都实现虚拟内存。一种解决方案是将其留给最终用户,例如在程序的配置中提供一个参数,用户可以将其设置为他认为合理的特定值。另一种策略可能是将值设置为物理内存大小的给定百分比。