天天看點

CUDA實踐指南(五)

并行化應用程式:

确定了熱點并完成了設定目标和期望的基本練習後,開發人員需要對代碼進行并行化。 根據原始代碼,這可以像調用現有的GPU優化庫(如cuBLAS,cuFFT或Thrust)一樣簡單,也可以像向并行編譯器添加一些預處理器指令那樣簡單。

另一方面,一些應用程式的設計需要一些重構來展現其固有的并行性。 由于即使将來的CPU架構也需要公開這種并行性以改進或簡單地維持順序應用的性能,是以CUDA并行程式設計語言系列(CUDA C / C ++,CUDA Fortran等)旨在盡可能簡化這種并行性的表達,同時使支援CUDA的GPU能夠在最大并行吞吐量的情況下運作。

入門:

并行化順序代碼有幾個關鍵政策。 盡管如何将這些政策應用到特定應用程式的細節是一個複雜且具有問題特征的主題,但無論我們是否并行化運作在多核CPU上的代碼或在CUDA GPU上使用的代碼,此處列出的一般主題都适用。

并行庫:

并行化應用程式最直接的方法是利用現有的庫,代表我們利用并行體系結構。 CUDA工具包包括許多已針對NVIDIA CUDA GPU進行微調的庫,例如cuBLAS,cuFFT等。

這裡的關鍵是,庫在與應用程式的需求相比對時最有用。 例如,已經使用其他BLAS庫的應用程式通常可以很容易地切換到cuBLAS,而對于線性代數幾乎沒有的應用程式對cuBLAS幾乎沒有用處。 其他CUDA工具包庫也是如此:cuFFT具有類似于FFTW等的界面。

還值得注意的是Thrust庫,它是一個類似于C ++标準模闆庫的并行C ++模闆庫。 Thrust提供了豐富的資料并行基元集合,如掃描,排序和縮減,它們可以組合在一起以實作具有簡潔可讀源代碼的複雜算法。 通過根據這些進階抽象描述您的計算,您可以為Thrust提供自動選擇最有效的實作的自由。 是以,Thrust可用于程式員生産力最重要的CUDA應用程式的快速原型開發,以及堅固性和絕對性能至關重要的生産。

并行化編譯器:

順序代碼并行化的另一種常見方法是利用并行化編譯器。 通常這意味着使用基于指令的方法,程式員使用編譯訓示或其他類似的符号向編譯器提供關于何處可以找到并行性的提示,而無需修改或修改底層代碼本身。 通過向編譯器公開并行性,指令允許編譯器執行将計算映射到并行體系結構的詳細工作。

OpenACC标準提供了一組編譯器指令,用于指定标準C,C ++和Fortran中的代碼循環和區域,這些代碼應該從主機CPU解除安裝到附加的加速器(如CUDA GPU)。 管理加速器裝置的細節由OpenACC啟用的編譯器和運作時隐式處理。

編碼揭示并行性:

對于需要超出現有并行庫或并行編譯器可提供的附加功能或性能的應用程式而言,并行程式設計語言(如CUDA C / C ++)與現有的順序代碼無縫內建是必不可少的。

一旦我們在應用程式的配置檔案評估中找到熱點并确定自定義代碼是最好的方法,我們就可以使用CUDA C / C ++将我們代碼的那部分内容的并行性暴露為CUDA核心。 然後,我們可以将此核心啟動到GPU上,并檢索結果,而無需對我們的其他應用程式進行重大改寫。

當我們的應用程式的總運作時間的大部分花費在代碼的一些相對孤立的部分中時,這種方法是最直接的。 更難以并行化的是具有非常平坦的輪廓的應用程式 - 即,花費的時間相對均勻地分布在寬廣的代碼庫部分的應用程式。 對于後一種應用程式,可能需要一定程度的代碼重構來暴露應用程式中固有的并行性,但請記住,此重構工作将趨于惠及所有未來體系結構,CPU和GPU等,是以它非常值得 應該有必要的努力。

繼續閱讀