0
所以問題就出在這裏。我有一段代碼,當它只在一個線程中執行時,它可以很好地工作。但是一旦這個代碼被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中,至少在那裏,當調試時,只需激活,以便調試器停止在所有類型的異常......長,但正確的做法!
當人們使用「tla」,比如「tbb」時,我會使用「wtf」;) – paulsm4 2012-07-31 17:37:00
PS:你是否已經在調試器中完成了這些任務?當它「凍結」時,它是在一個無限循環中嗎?阻止?僵持?你的線程可能會加入全局變量嗎?等等 – paulsm4 2012-07-31 17:39:52
在VS中的默認調試器不縫以捕捉任何錯誤...並嘗試並行地通過它,不知道如何!我現在將問題隔離爲單個函數調用。仍然在分析......但希望能與TBB一起學習更多技巧!所以,如果你通過檢查某個特定的東西來解決類似的問題,它可能會有所幫助! – widgg 2012-07-31 17:46:29