首页 文章

内存泄漏,TBB 4.2具有高多线程

提问于
浏览
3

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

使用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百万是您可以开始注意到大块内存丢失的地方 .

我的问题 -

  • 这是一个在以后的TBB版本中修复过的旧问题吗?

  • 它是否被忽视,因为人们通常不会使用需要如此大/被访问/分配的并发容器以及如此高的线程负载?

  • 有谁知道解决这个问题的方法?

我的应用程序处理大量数据,这样我就无法使用多线程或事先知道我的操作所需的容器大小 .

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


Edit:

我的版本是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 回答

  • 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上寻求帮助 . 请注意,性能改进的交易内存消耗是并行编程中的传统交易 .

相关问题