多核架構程式碼遷移方法
| 一位華夏公益教科書作者認為此頁面應拆分為更小的頁面,幷包含更窄的子主題。 您可以透過將此大頁面拆分為更小的頁面來提供幫助。請務必遵循命名策略。將書籍分成更小的部分可以提供更多關注點,並允許每個部分都做好一件事,這對所有人都有益。 |
本華夏公益教科書描述了一種逐步方法,用於將傳統程式碼移植到多核架構。
此方法由高效能計算 (HPC) 參與者用作 HMPP 能力中心的一部分。 HMPP 能力中心彙集合作伙伴,在技術(並行程式設計、程式碼調優等)和應用程式級別應對多核程式設計挑戰。
將程式碼移植到多核系統是一個複雜的操作,需要整合許多技能才能實現計劃結果的計劃工作量。從計算機科學的角度來看,將應用程式移植到多核目標包括提供一個等效的程式,該程式透過利用硬體級別的並行性來更快地執行。目標是提高效能,而不必使用所有硬體元件。如果基於序列程式碼的解決方案是最好的,則應考慮它。
遷移應用程式主要有兩個交織的維度
- 實現高效能;
- 從應用程式開發人員的角度來看,保持程式碼的可讀性/可維護性。遷移後的程式碼仍然可以被程式碼所有者理解以及易於維護是一個主要約束。
在大多數情況下,起點是順序遺留程式。它的遷移主要是因為沒有自動過程可以將順序程式碼轉換為利用大量核心的大規模並行版本。由於處理器格局的快速發展使軟體開發變得更加複雜,因此通常的並行程式設計策略將不得不進行修改以適應現有應用程式,以便利用這些新處理器。
除了清楚地瞭解如何將應用程式遷移到新的多核處理器(目前是 GPU)外,方法的主要目標是降低風險並提高效率。事實上,開始一個專案並在幾個月後意識到已經投入了工程資源和資金但該專案無法成功,這是不可行的。
此處定義的程式碼遷移過程不過是將開發週期細分為具有相關持續時間的步驟的常識方法。每個步驟都指示使用哪些工具,並在開始下一階段之前產生一個繼續/停止決策。
三個步驟是
- 並行專案定義:在此步驟中,對應用程式進行診斷,以評估潛在的加速並確定與成本相關的主要移植操作。作為先決條件,將建立一個驗證過程以確保數值結果的有效性。
- 應用程式移植:在幾周內,開發了程式碼的第一個功能性 GPU 版本,並執行了 GPU 執行配置檔案以識別瓶頸,以便在下一步中提高程式碼效率。
- 應用程式最佳化:分析瓶頸並執行程式碼最佳化以獲得經過微調的生產程式碼。由於存在未成功的風險,此步驟可能比之前的步驟持續時間更長。
前兩個步驟屬於初始階段的一部分,旨在展現異構並行性。它們由熟悉應用程式演算法和計算方法的程式設計師執行。第三步,即第二階段,需要更多程式碼調優技術的技能。
這些步驟是在控制成本的情況下定義的。隨著遷移過程的進行,失敗的風險降低,可以將更多人力投入到最終操作中。遷移方法真正面向在給定時間段內進行“盡力而為”的方法。

圖中展示的工具只是示例,可以藉助參考資料進行補充。
圖 1 中的頂部部分詳細介紹了執行的步驟,以分析程式碼並定義主要的遷移操作
- 熱點識別:使用分析工具,此第一階段旨在找到可能從 GPU 加速中受益的關鍵熱點。可能需要重寫程式碼以增加資料並行性。
- CPU 分析:CPU 分析是必要的,以確保原始程式碼已充分最佳化,可以作為公平的效能比較基準。調優 CPU 程式碼通常也會導致有效的遷移起點。
- 並行性發現:此步驟確保核心可以並行執行。如果不是這種情況,加速器將無法實現效能提升。然後應重新考慮演算法以展現並行性。

圖 2 底部的框給出了開發和構建應用程式的第一個功能性 GPU 版本的步驟。它們主要包括透過使用 HMPP 指令註釋先前識別的熱點來生成和呼叫 GPU 核心。
這些步驟是增量執行的:核心被逐個移植和驗證;根據原始 CPU 效能評估其效能,以檢查它們是否適合 GPU 執行;根據 HMPP 嚮導的建議,對核心計算應用基本的程式碼轉換,以使其對 GPU 友好;一些資料傳輸基本上進行了最佳化,以便在程式碼片段執行之前預載入資料並抑制對常量資料的冗餘傳輸。此初步移植版本用作識別 GPGPU 問題以及驗證實現的並行屬性。透過能夠跟蹤更改,增量方式允許更容易地查詢和糾正錯誤,在最壞的情況下可以恢復。事實上,如果一次進行太多轉換,很容易迷失方向。

在此最後一步中,透過進一步減少資料傳輸、微調 GPU 核心效能以及將 GPU 裝置分配移動到應用程式啟動時來最佳化整個混合應用程式。
- 目標架構和作業系統是什麼?
- 對編譯器、庫、軟體許可證(例如 GPL)有什麼限制?
- 所有程式碼和必要的庫是否都可以在目標機器上使用?
- 是否有可用的代表性輸入資料集?
- 與順序結果相比,並行執行結果是否需要逐位等效?
- 是否已定義驗證執行結果的過程(考慮到浮點數舍入的更改)?
- 是否有能夠回答有關應用程式程式碼和演算法問題的參考人?
- 是否清楚地定義了效能目標(以及在哪些執行配置檔案上)?
- 是否有可用的程式碼功能描述和文件?
- 通常執行哪些型別的生產執行(例如吞吐量模式、截止日期模式等)?
- Banerjee, U., Bliss. B., Ma, Z. 和 Petersen, P.,“在英特爾® 執行緒檢查器中揭示資料競爭檢測”,於 2006 年 3 月 26 日在美國紐約曼哈頓舉行的第一屆多核系統軟體工具研討會 (STMCS) 上發表,與 IEEE/ACM 國際程式碼生成與最佳化研討會 (CGO) 同時舉行。
- D.F. Bacon、S.L. Graham、O.J. Sharp,面向高效能計算的編譯器轉換,“ACM 計算機調查”,1994 年 12 月,第 26 卷,第 4 期,第 345-420 頁
- David Blair Kirk、Wen-mei W. Hwu:大規模並行處理器程式設計——實踐方法。Morgan Kaufmann 2010:I-XVIII,1-258
- F. Bodin、S. Bihan,“面向圖形處理單元的異構多核並行程式設計”,科學程式設計雜誌,第 17 卷,第 4 期 / 2009 年。
- G. Hager 和 G. Wellein:面向科學家和工程師的高效能計算入門。CRC 計算科學系列,2010 年。 ISBN 978-1439811924
- Herlihy,M. 和 Shavit,N.,多處理器程式設計藝術,Morgan Kaufmann,2008 年。
- John L. Hennessy 和 David A. Patterson。2003 年。計算機體系結構;定量方法(第 3 版)。Morgan Kaufmann 出版公司,美國加利福尼亞州舊金山。
- Kennedy,K. 和 Allen,J. R. 2002 年。面向現代體系結構的最佳化編譯器:基於依賴項的方法。Morgan Kaufmann 出版公司。
- 科學應用程式的效能最佳化,David H. Bailey、Robert F. Lucas、Samuel Williams
- S. Akhter:多核程式設計:透過軟體多執行緒提高效能。英特爾出版社,2006 年。 ISBN 978-0976483243
- Timothy Mattson、Beverly Sanders 和 Berna Massingill。2004 年。並行程式設計模式(第一版)。Addison-Wesley 專業版。
- U. Banerjee。面向超級計算的依賴項分析。Kluwer 學術出版社,馬薩諸塞州諾威爾,1988 年。
網上有很多資源,以下列舉了一些。
- ACM 平行計算技術包: http://techpack.acm.org/parallel/JourneymanTour.pdf
- Allinea DDT: http://www.allinea.com/products/ddt/
- Allinea OPT: http://www.allinea.com/products/opt/
- 來自編譯器的自動並行化,例如英特爾編譯器 (http://software.intel.com/en-us/articles/automatic-parallelization-with-intel-compilers/)、PGI 編譯器 (http://www.pgroup.com/products/pgicdk.htm)、PathScale 編譯器 (http://www.pathscale.com/pdf/QuickReference.pdf) 等。
- 自動調整的線性代數軟體: http://math-atlas.sourceforge.net/
- 並行程式設計與構建: http://www.mcs.anl.gov/~itf/dbpp/
- 離散傅立葉變換: http://www.fftw.org/
- GPGPU.org 是 GPGPU 新聞和資訊的中心資源: http://gpgpu.org
- Gprof:GNU 分析器。 http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html。
- GPUCV(GPU 加速的影像處理): https://picoforge.int-evry.fr/cgi-bin/twiki/view/Gpucv/Web/
- HMPP 工作臺: http://www.caps-entreprise.com/fr/page/index.php?id=49&p_p=36
- HpcToolkit: http://hpctoolkit.org/
- http://bebop.cs.berkeley.edu/oski/
- http://developer.amd.com/gpu/acmlgpu/Pages/default.aspx
- http://developer.amd.com/zones/openclzone/pages/default.aspx
- http://developer.amd.com/zones/OpenCLZone/pages/toolsandlibraries.aspx
- http://en.wikipedia.org/wiki/Automatic_parallelization
- http://en.wikipedia.org/wiki/Data_dependency
- http://en.wikipedia.org/wiki/HMPP_Open_Standard
- http://en.wikipedia.org/wiki/Loop_nest_optimization
- http://en.wikipedia.org/wiki/Parallel_computing
- http://golem5.org/gatlas/
- http://icl.cs.utk.edu/magma/
- http://math.nist.gov/sparselib++/
- http://openmp.org/wp/
- http://software.intel.com/en-us/articles/intel-mkl/
- http://support.amd.com/us/Processor_TechDocs/40546.pdf
- http://www-users.cs.umn.edu/~karypis/parbook/
- http://www.akkadia.org/drepper/cpumemory.pdf
- http://www.cs.berkeley.edu/~volkov/volkov09-optimizing.pdf
- http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf
- http://www.culatools.com/
- http://www.hipeac.net/system/files/NemaLabs_0.pdf
- http://www.khronos.org/opencl
- http://www.nas.nasa.gov/Resources/Software/npb.html
- http://www.nemalabs.com/
- http://www.netlib.org/lapack/
- http://www.NVIDIA.com/content/GTC/documents/1418_GTC09.pdf
- http://www.pathscale.com/pdf/PathScale-ENZO-1.0-UserGuide.pdf
- http://www.vi-hps.org/
- http://www.vi-hps.org/training/
- https://computing.llnl.gov/tutorials/openMP/
- https://computing.llnl.gov/tutorials/parallel_comp/
- 英特爾 IPP: http://www.intel.com/software/products/ipp
- 並行程式設計入門: https://computing.llnl.gov/tutorials/parallel_comp/
- Linux“time”命令: https://computing.llnl.gov/tutorials/performance_tools/#time
- 多核協會: http://www.multicore-association.org/workgroup/mpp.php
- NVIDIA CUDA 可用: http://developer.NVIDIA.com/object/cuda home.html。
- NVIDIA CUDA: http://developer.NVIDIA.com/object/cuda home.html
- NVIDIA NSight: http://developer.NVIDIA.com/NVIDIA-parallel-nsight
- Opari: http://www.fz-juelich.de/zam/kojak/opari
- OpenCL 最佳實踐: http://www.NVIDIA.com/content/cudazone/CUDABrowser/downloads/papers/NVIDIA_OpenCL_BestPracticesGuide.pdf
- OpenCV(開源計算機視覺): http://opencv.willowgarage.com/wiki/
- OpenHMPP: http://www.openhmpp.org/
- Oprofile: http://oprofile.sourceforge.net/
- PAPI(效能 API): http://icl.cs.utk.edu/papi/
- Paraver: http://www.bsc.es/plantillaA.php?cat_id=485
- 效能分析工具: https://computing.llnl.gov/tutorials/performance_tools/
- Rogue Wave TotalView: http://www.roguewave.com/products/totalview-family/totalview.aspx
- TAU: http://tau.uoregon.edu
- Valgrind: http://valgrind.org/
- Vampire: http://www.vampir.eu