天天看點

Intel Threading Building Blocks (TBB)介紹

原文

Intel Threading Building Blocks(Intel TBB)是一個使用标準 ISO C++ 代碼支援可擴充并行程式設計的庫。它不需要特殊的語言或編譯器。它旨在促進可擴充的資料并行程式設計。此外,它完全支援嵌套并行性,是以你可以從較小的并行元件建構較大的并行元件。要使用該庫,你需要指定任務而不是線程,并讓庫以有效的方式将任務映射到線程上。

許多庫接口采用泛型程式設計,其中接口由對類型而不是特定類型的要求定義。 C++ 标準模闆庫 (STL) 是泛型程式設計的一個例子。泛型程式設計使 TBB 既靈活又高效。泛型接口使你能夠根據你的特定需求自定義元件。

最終結果是,TBB 使你能夠比使用原始線程更友善地指定并行性,同時還可以提高性能。

優化注意

Intel 的編譯器可能會也可能不會針對非 Intel 微處理器進行相同程度的優化,以進行非 Intel 微處理器獨有的優化。 這些優化包括 SSE2、SSE3 和 SSSE3 指令集和其他優化。 Intel 不保證對非 Intel 制造的微處理器進行任何優化的可用性、功能或有效性。 本産品中依賴于微處理器的優化旨在與 Intel 微處理器一起使用。 某些不特定于 Intel 微體系結構的優化是為 Intel 微處理器保留的。 有關本通知涵蓋的特定指令集的更多資訊,請參閱适用的産品使用者和參考指南。 通知修訂#20110804

好處

TBB是一個庫,可幫助你利用多核性能,而無需成為線程專家。 通常,你可以通過實施“開發人員指南”前面部分中解釋的關鍵點來提高多核處理器的性能。 随着你的專業知識的增長,你可能希望深入研究進階部分所涵蓋的更複雜的主題。

并行程式設計有多種方法,從使用平台相關的線程原語到異國情調的新語言。 TBB 的優勢在于它比原始線程在更進階别上工作,而且不需要外來語言或編譯器。 你可以将它與任何支援 ISO C++ 的編譯器一起使用。 該庫在以下方面與典型的線程包不同:

  • TBB使你能夠指定邏輯并行而不是線程。 大多數線程包要求你指定線程。 直接根據線程進行程式設計可能會很乏味并導緻程式效率低下,因為線程是接近硬體的低級、繁重的結構。 使用線程直接程式設計迫使你将邏輯任務有效地映射到線程上。 相比之下,TBB runtime 庫以高效利用處理器資源的方式自動将邏輯并行映射到線程上。
  • TBB以線程化為目标,以提高性能。 大多數通用線程包支援許多不同類型的線程,例如圖形使用者界面中異步事件的線程。 是以,通用包往往是提供基礎而非解決方案的低級工具。 相反,TBB 專注于并行化計算密集型工作的特定目标,提供更進階别、更簡單的解決方案。
  • TBB與其他線程包相容。 由于該庫并非旨在解決所有線程問題,是以它可以與其他線程包無縫共存。
  • TBB強調可擴充的資料并行程式設計。 将程式分解成單獨的功能塊,并為每個塊配置設定一個單獨的線程是一種通常不能很好擴充的解決方案,因為功能塊的數量通常是固定的。 相比之下,TBB 強調資料并行程式設計,支援多個線程處理集合的不同部分。 通過将集合分成更小的部分,資料并行程式設計可以很好地擴充到更多的處理器。 使用資料并行程式設計,程式性能會随着處理器的增加而提高。
  • TBB依賴于泛型程式設計。 傳統庫根據特定類型或基類指定接口。 相反,TBB 使用泛型程式設計。 泛型程式設計的本質是編寫具有最少限制的最佳算法。 C++ 标準模闆庫 (STL) 是泛型程式設計的一個很好的例子,其中接口由類型要求指定。 例如,C++ STL 有一個模闆函數 sort 可以對根據序列上的疊代器抽象定義的序列進行排序。 對疊代器的要求是:
    • 提供随機通路
    • 如果疊代器 i 指向的項應該在疊代器 j 指向的項之前,則表達式 *i<*j 為真,否則為假。
    • 表達式 swap(*i,*j) 交換兩個元素。
  • 類型要求方面的規範使模闆能夠對序列的許多不同表示進行排序,例如向量和雙端隊列。 類似地,TBB 模闆指定對類型的要求,而不是特定類型,進而适應不同的資料表示。 泛型程式設計使 TBB 能夠提供具有廣泛适用性的高性能算法。