可以用 openmp 并行化内存分配删除吗?(c++)

Min*_*Kim 3 c++ linux multithreading kill openmp

int **something = new int *[N];
for(int n = 0; n < N; n++)
    something[n] = new int[M];

#pragma omp parallel for
for (int n = 0; n < N; n++)
    delete[] something[n];
delete[] something;
Run Code Online (Sandbox Code Playgroud)

我可以并行化这样的删除过程吗?

Linux 的 OOM 杀手在经过大量循环后杀死了我的进程。我试图找出内存泄漏的地方,但我找不到哪里。我不确定这些 for 循环删除过程是否运行良好。

Jon*_* S. 6

这一般来说是没问题的。标准 (g)libc 堆必须是线程安全的;否则,根本不可能编写线程程序。也可以在一个线程上分配缓冲区并在另一个线程上释放它。

并行化堆分配不会给你带来很大的加速,但我怀疑你问的不是因为你想加速(取消)分配,而是因为你有一些其他并行代码恰好分配和释放一些缓冲区。

要查找泄漏,请尝试使用 valgrind 运行程序。

此外,请考虑malloc_trim(0);在释放大量内存后调用。这使得 glibc 将未使用的内存释放回操作系统,而不是保留所有内存以供以后分配。

  • 并行分配实际上会有所帮助,因为不同的线程具有不同的内存区域。所以这可以并行化。我刚刚对此进行了测试,发现我的系统上有一个因子 4。仅仅并行化释放不会有帮助,因为每个线程都会竞争分配所有内容的一个竞技场的锁 (2认同)