簡體   English   中英

英特爾 TBB 並行化開銷

[英]Intel TBB Parallelization Overhead

為什么 Intel Threading Building Blocks (TBB) parallel_for有這么大的開銷? 根據Tutorial.pdf中的第 3.2.2 節自動分塊。pdf大約半毫秒。 這是教程中的一個嘗試:

注意:通常一個循環需要至少一百萬個時鍾周期才能使 parallel_for 提高其性能。 例如,在 2 GHz 處理器上花費至少 500 微秒的循環可能會受益於 parallel_for。

從我目前所讀到的內容來看,TBB 在內部使用線程池(工作線程池)模式,它通過最初僅產生工作線程一次(花費數百微秒)來防止這種糟糕的開銷。

那么什么是花時間呢? 使用互斥鎖的數據同步不是那么慢嗎? 此外,TBB 不使用無數據結構進行同步嗎?

從我目前所讀到的內容來看,TBB 在內部使用線程池(工作線程池)模式,它通過最初僅產生工作線程一次(花費數百微秒)來防止這種糟糕的開銷。

是的,TBB 預先分配線程。 每當它看到parallel_for時,它不會物理地創建和加入工作線程。 OpenMP 和其他並行庫都進行預分配。

但是,從池中喚醒線程並將邏輯任務分派給線程仍然存在開銷。 是的,TBB 利用無鎖數據結構來最小化開銷,但它仍然需要一些並行開銷(即串行部分)。 這就是為什么 TBB 手冊建議避免非常短的循環。

通常,您必須有足夠的工作才能獲得並行加速。 我認為即使是 1 毫秒(=1,000 微秒)也太小了。 根據我的經驗,為了看到有意義的加速,我需要將執行時間增加大約 100 毫秒。

如果 TBB parallel_for的並行開銷對您來說真的很重要,那么可能值得嘗試一個簡單的 static 調度。 我對 TBB 的 static 調度實現不太了解。 但是,您可以輕松嘗試 OpenMP 的: omp parallel for schedule(static) 我相信這個開銷將是並行的最小成本。 但是,由於它使用的是 static 調度,因此將失去動態調度的好處(尤其是當工作負載不均勻時)。

暫無
暫無

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

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