簡體   English   中英

TBB中的並行執行凍結

[英]parallel execution in TBB freezes

這就是問題所在。 我有一段代碼,當僅在一個線程中執行時,它可以完美運行。 但是一旦用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中,至少在調試時,只需在其中激活即可,以便調試器會在各種異常下停止……很長,但是正確的方法!

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

不好的解決方案是在分配內存的地方使用互斥鎖。 這很不好,因為您最終會使X處理器運行到最大……主要是在等待互斥鎖。

我們使用的最終方法是每個片都有其一個內存分配方案。 然后,通過使用“聯接”,我們在計算數據之后將它們合並在一起。 因此,這種方式可使處理器在沒有任何互斥的情況下運行。 但這導致需要更多的內存。 但是,由於線程之間沒有重復,所以應該沒問題!

因此,經驗教訓!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM