簡體   English   中英

英特爾Tbb開銷問題

[英]Intel Tbb overhead issue

我使用Intel TBB並行處理在圖像上處理的算法的某些部分。 盡管對每個像素的處理取決於數據,但是在某些情況下,可以如下並行處理2個連續像素。

ProcessImage(image)
    for each row in image // Create and wait root task for each line here using allocate_root()
        ProcessRow(row) 
        for each 2 pixel
            if(parallel())
                ProcessPixel(A) and ProcessPixel(B) in parallel // For testing, create and process 2 tbb::empty_task() here as child tasks
            else
                ProcessPixel(A)
                ProcessPixel(B)

但是,發生開銷是因為該處理非常快。 對於每個輸入圖像(大小為512x512),處理成本約為5-6毫秒。 當我在上面實驗性地使用Intel TBB作為注釋塊時,處理過程要花費25毫秒以上。

那么,有沒有更好的方法來使用英特爾TBB而不產生開銷問題,或者采用其他更有效的方法來提高像這樣的簡單快速處理程序的性能?

TBB不會為調用並行算法增加如此大的開銷(〜20ms)。 我的猜測(由於未提供具體細節)是與以下之一有關:

  1. 如果僅測量第一次調用,則其中包括創建工作線程的開銷。 請注意,TBB沒有像OpenMP這樣的障礙,因此對parallel_for一次調用可能不足以創建所有線程)
  2. 由於沒有並行工作,工作線程進入睡眠狀態后也會發生相同的情況。 喚醒的開銷比線程創建的開銷低幾個數量級,但仍會影響測量並得出錯誤的結論。
  3. TBB調度程序可以竊取從外層到嵌套層的任務(阻塞調用),因此,只有在忙於處理嵌套部分時,測量看起來才花很長時間。
  4. 由顯式(例如互斥)或隱式(例如虛假共享)原因引起的並行處理(A)和(B)存在爭用。 但是無論如何,它不是特定於TBB的。

因此,使用TBB進行性能測量的建議是僅考慮總時間以進行足夠長的計算序列,這將隱藏初始化開銷。

當然,正如建議的那樣,首先在外層平行進行。 TBB為此提供了足夠的不同模式,包括tbb::parallel_pipelinetbb::flow::graph

暫無
暫無

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

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