2012-07-31 34 views
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中,至少在那裏,當調試時,只需激活,以便調試器停止在所有類型的異常......長,但正確的做法!

+2

當人們使用「tla」,比如「tbb」時,我會使用「wtf」;) – paulsm4 2012-07-31 17:37:00

+0

PS:你是否已經在調試器中完成了這些任務?當它「凍結」時,它是在一個無限循環中嗎?阻止?僵持?你的線程可能會加入全局變量嗎?等等 – paulsm4 2012-07-31 17:39:52

+0

在VS中的默認調試器不縫以捕捉任何錯誤...並嘗試並行地通過它,不知道如何!我現在將問題隔離爲單個函數調用。仍然在分析......但希望能與TBB一起學習更多技巧!所以,如果你通過檢查某個特定的東西來解決類似的問題,它可能會有所幫助! – widgg 2012-07-31 17:46:29

回答

0

自然,這是一個內存分配問題。

不好的解決方案是在分配內存的地方使用互斥鎖。這很糟糕,因爲你的X處理器運行到最大......主要是等待互斥體。

我們使用的最後一種方法是每個slice都有一個內存分配方案。然後,通過使用「連接」,我們將數據合併後計算。所以這種方式處理器沒有任何互斥體運行。但是這導致需要更多內存。但是,就像線程之間沒有重複一樣,你應該沒問題!

所以,經驗教訓!