OpenMP 線程處理的基本消耗

介紹
如果您有現成的代碼,並希望使其實現線程化,以令其在多核系統上達到最佳運行效果。 開始使用前您需要了解哪些內容?

本文將說明如何開始使用 OpenMP 對代碼進行線程化處理,幫助您確定從何處進行線程化,並顯示如何衡量所產生的代碼的性能。 還將舉例比較該線程技術與典型的 Win32 線程處理。

現今,越來越多的多核處理器不斷面市。 因此,開發人員需要在代碼中添加線程來利用系統所提供的多個內核,並將對性能比較敏感的代碼分隔在多個內核上。 但同時,必須確保代碼具有良好的可伸縮性;無論在單核計算機、雙核計算機、四核計算機及更高級別的計算機上,同樣的代碼都必須能夠運行良好。 本文着重說明使用 OpenMP 線程處理庫的某些常用線程處理技術以及性能衡量方法。 這將提供某些性能基準供您使用,幫助您理解如何實現代碼線程化以及如何衡量其性能。

OpenMP 是用於編寫直接線程化代碼的線程處理庫, 通常用於向現有的單線程代碼中添加線程處理。 本文假定您熟悉線程概念,但可能尚未使用過 OpenMP 或很少對代碼進行線程化處理來提高性能。

我們不妨看一些簡單的代碼,使用 OpenMP 添加線程,然後看看它在雙核系統上的執行情況。 這樣,您可以清楚地瞭解 OpenMP 是如何運行的,以及如何修改自己編寫的代碼並對其進行性能評定。 爲便於比較,文中還給出了 Win32 線程處理。

所有代碼均使用 C++ 編寫,使用英特爾 C++ 編譯器 9.0 編譯。 性能評測平臺爲 Windows XP SP2。 有關測試硬件的詳細信息,請參閱“配置”附錄。

在此處顯示的示例中,OpenMP 代碼具有良好的可伸縮性,當強制其以單線程運行時,性能略有降低。 OpenMP 的消耗與 Win32 線程類似。 但無論是 OpenMP 還是 Win32 線程,循環啓動的消耗都很高。 這表明,對於非常小的循環或對性能高度敏感的應用程序來說,不適合使用這些機制進行線程化。 在這些情況下,需要採用象線程池之類的機制實現線程化。
OpenMP 實驗
英特爾全球合作伙伴關係部高級軟件工程師 Paul Lindberg

爲什麼要注意這個代碼示例?

示例代碼顯示瞭如何衡量 OpenMP 基本的線程處理性能。

摘要/概述
本代碼選取了一段簡單的串行代碼,通過不同方式對它進行線程化。 然後使用一個測試工具進行性能衡量,從而幫助我們理解不同方法之間的差異。

目標讀者
考慮使用(或已經使用)OpenMP 執行線程處理的 C++ 開發人員,他們希望瞭解代碼如何執行

示例類別:完整項目

實現語言: C++

目標軟硬件平臺

硬件系統: 運行有英特爾多核處理器的系統

操作系統: Windows XP 及更高級別

編譯器: Microsoft Visual Studio.NET 2003、英特爾 C++ 編譯器 9.0

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章