所以这就是问题所在。我有一段代码,当只在一个线程中执行时,它完美地工作。但是一旦使用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中,至少在那里,在调试时,只需激活,这样调试器就会停止所有类型的异常...很长,但是正确的方法!
答案 0 :(得分:0)
很自然,这是一个内存分配问题。
糟糕的解决方案是使用分配内存的互斥锁。这很糟糕,因为最终你的X处理器运行到最大...大多等待互斥锁。
我们使用的最后一种方法是每个切片都有一个内存分配方案。然后,通过使用“连接”,我们在计算后将数据合并在一起。所以这样处理器在没有任何互斥锁的情况下运行。但这会导致需要更多内存。但是因为线程之间没有重复,你应该没问题!
所以,吸取了教训!