[英]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.