本文將說明如何開始使用 OpenMP 對代碼進行線程化處理,幫助您確定從何處進行線程化,並顯示如何衡量所產生的代碼的性能。 還將舉例比較該線程技術與典型的 Win32 線程處理。
現今,越來越多的多核處理器不斷面市。 因此,開發人員需要在代碼中添加線程來利用系統所提供的多個內核,並將對性能比較敏感的代碼分隔在多個內核上。 但同時,必須確保代碼具有良好的可伸縮性;無論在單核計算機、雙核計算機、四核計算機及更高級別的計算機上,同樣的代碼都必須能夠運行良好。 本文着重說明使用 OpenMP 線程處理庫的某些常用線程處理技術以及性能衡量方法。 這將提供某些性能基準供您使用,幫助您理解如何實現代碼線程化以及如何衡量其性能。
OpenMP 是用於編寫直接線程化代碼的線程處理庫, 通常用於向現有的單線程代碼中添加線程處理。 本文假定您熟悉線程概念,但可能尚未使用過 OpenMP 或很少對代碼進行線程化處理來提高性能。
我們不妨看一些簡單的代碼,使用 OpenMP 添加線程,然後看看它在雙核系統上的執行情況。 這樣,您可以清楚地瞭解 OpenMP 是如何運行的,以及如何修改自己編寫的代碼並對其進行性能評定。 爲便於比較,文中還給出了 Win32 線程處理。
所有代碼均使用 C++ 編寫,使用英特爾 C++ 編譯器 9.0 編譯。 性能評測平臺爲 Windows XP SP2。 有關測試硬件的詳細信息,請參閱“配置”附錄。
在此處顯示的示例中,OpenMP 代碼具有良好的可伸縮性,當強制其以單線程運行時,性能略有降低。 OpenMP 的消耗與 Win32 線程類似。 但無論是 OpenMP 還是 Win32 線程,循環啓動的消耗都很高。 這表明,對於非常小的循環或對性能高度敏感的應用程序來說,不適合使用這些機制進行線程化。 在這些情況下,需要採用象線程池之類的機制實現線程化。
爲什麼要注意這個代碼示例?
本示例代碼顯示瞭如何衡量 OpenMP 基本的線程處理性能。
摘要/概述
本代碼選取了一段簡單的串行代碼,通過不同方式對它進行線程化。 然後使用一個測試工具進行性能衡量,從而幫助我們理解不同方法之間的差異。
目標讀者
考慮使用(或已經使用)OpenMP 執行線程處理的 C++ 開發人員,他們希望瞭解代碼如何執行
示例類別:完整項目
實現語言: C++
目標軟硬件平臺
硬件系統: 運行有英特爾多核處理器的系統
操作系統: Windows XP 及更高級別
編譯器: Microsoft Visual Studio.NET 2003、英特爾 C++ 編譯器 9.0