TBB中的并行执行冻结

时间:2012-07-31 17:32:43

标签: c++ tbb

所以这就是问题所在。我有一段代码,当只在一个线程中执行时,它完美地工作。但是一旦使用TBB调用此代码,它就会冻结(或者我没有耐心等待它完成!)。

代码太长了,但想象一下:

class TBB_Test
{
public:
  TBB_Test(void) { /* initialize the stuff */ }

  void operator() (tbb::blocked_range<int> &r) const
  {
    for (int i = r.begin(); i != r.end(); ++i)
    {
      // compute very awesome stuff!
    }
  }
};

所以,当我按顺序执行时:

TBB_Test() (tbb::blocked_range<int>(0, max_value));

它有效,但一旦并行:

tbb::parallel_for(tbb::blocked_range<int>(0, max_value, grainsize), TBB_Test());

它冻结而不是比顺序更快。

什么可能导致这样的事情?两个线程试图在同一个地方读或写?在我们的案例中,写作不应该发生!而且我们还有其他情况,多个线程可能会读取相同的地址,并且它不会冻结!

有什么想法吗?

在VStudio中,至少在那里,在调试时,只需激活,这样调试器就会停止所有类型的异常...很长,但是正确的方法!

1 个答案:

答案 0 :(得分:0)

很自然,这是一个内存分配问题。

糟糕的解决方案是使用分配内存的互斥锁。这很糟糕,因为最终你的X处理器运行到最大...大多等待互斥锁。

我们使用的最后一种方法是每个切片都有一个内存分配方案。然后,通过使用“连接”,我们在计算后将数据合并在一起。所以这样处理器在没有任何互斥锁的情况下运行。但这会导致需要更多内存。但是因为线程之间没有重复,你应该没问题!

所以,吸取了教训!