具有高多线程的TBB 4.2导致内存泄漏

时间:2015-10-22 06:54:53

标签: c++ multithreading memory-leaks tbb

我不确定这是假阳性还是真正的问题。我已经尝试过但未能找到其他人面对/修复此问题。

使用TBB版本4.2(由于遗留问题,我无法升级)。我在使用TBB并发容器和高负载的TBB并行线程时观察到我的应用程序内存泄漏。

重现此问题的简单代码段 -

#include "tbb/tbb.h"

void testFunc()
{
    tbb::concurrent_unordered_map<int,int> t;
    tbb::parallel_for(1,100,[&](int p)
    {
        tbb::parallel_for(1,10000000,[&](int n)
        {
            t.insert(tbb::concurrent_unordered_map<int,int>::value_type(n,n));
        });
    });
    t.clear();
}
int main()
{
    testFunc();
    return 0;
}

每次执行testFunc()时,这都会泄漏大约500MB。

我再次迭代,当你一次只运行大约1000-100000个线程时,你没有注意到这一点。 1百万是你可以开始注意到大块记忆丢失的地方。

我的问题 -

  1. 这是一个在以后的TBB版本中修复过的旧问题吗?
  2. 它是不被人注意的,因为人们通常倾向于使用 需要如此大/被访问/分配的并发容器 还有如此高的螺纹载荷?
  3. 有没有人知道的方法 解决这个问题?
  4. 我的应用程序处理大量数据,这样我就无法使用多线程或事先知道我的操作所需的容器大小。

    任何帮助将不胜感激!谢谢!

    修改

    我的版本是4.2.2014.601。我似乎无法找到来自哪个更新。

    我已经检查了更改列表,我确实注意到版本4.3更新6中的某些内容,他们说他们已经修复了在高并行负载下消耗大量内存的竞争条件。我不确定这是否是同一问题的表现?我也不确定如何验证这一点。

    我在运行程序时只使用了Visual Leak Detector,而且我很确定它不是以后完成线程的情况,因为我可以看到直到我使用的内存块显式关闭我的应用程序(从Windows任务管理器注意到)

    我的系统有4个内核,4个线程。这也发生在concurrent_unordered_set上。该应用程序广泛使用TBB并发容器和parallel_for,当迭代次数达到数十万时,我没有注意到泄漏。一旦你达到一百万,它就可见了。

    我也在TBB上发布了这个问题。对于那些可能面临类似问题的人 - https://software.intel.com/en-us/forums/intel-threading-building-blocks/topic/597165

    一旦他们确定是用户错误还是真正的问题,我也会在此发布他们的回复;)

1 个答案:

答案 0 :(得分:1)

自TBB 4.2上次更新发布(5)以来,TBB的CHANGES文件没有说明concurrent_unordered_map或内存泄漏问题。但是,如果您没有使用TBB 4.2的最新更新,则在英特尔至强融核(MIC)和parallel_reduce(不是_for)上修复了内存泄漏。

您尚未描述您的系统(例如N个线程)或使用的工具,因此我必须猜测。但是,如果您使用TBB 4.2的最新更新版本或仅使用常规CPU并且仅使用parallel_for运行复制器,则可能是TBB或内存泄漏检测方式存在问题。

后者的示例可以是在TBB调度程序或TBB内存分配器中缓存内存,以及工作线程终止点w.r.t. this answer中描述的内存泄漏检测点。

当您验证检测方法并且仍然不满意内存消耗时,请向TBB forum寻求帮助。请注意,性能改进的交易内存消耗是并行编程中的传统交易。