0

所以这就是问题所在。我有一段代码,当只在一个线程中执行时,它工作得很好。但是一旦使用 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 中,至少在那里,在调试时,只需激活,这样调试器就会在所有类型的异常中停止……很长,但是正确的方法!

4

1 回答 1

0

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

不好的解决方案是在分配内存的地方使用互斥锁。这很糟糕,因为你最终会让你的 X 处理器运行到最大......主要是在等待互斥体。

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

所以,吸取教训!

于 2012-09-04T14:13:26.877 回答