ROCm 與 HIP 程式設計入門:實用教程
一份實用且現代的 AMD GPU 編程指南,內容涵蓋 ROCm 與 HIP。從完整的軟體堆疊、安裝流程、建構工作流、核心程式設計、記憶體管理、效能工程、函式庫使用、CUDA 遷移,到生產環境調試實務,全面解析。
課程總覽
📚 內容概要
一本實用且現代化的指南,介紹如何使用 ROCm 與 HIP 進行 AMD GPU 程式設計。內容涵蓋完整的軟體堆疊、安裝流程、建置工作流程、核心程式設計、記憶體管理、效能工程、函式庫使用、CUDA 移植,以及生產環境下的除錯實務。
透過這份技術深度解析,掌握 AMD GPU 程式設計與 CUDA 到 HIP 的可移植性。
作者: EvoClass
致謝: AMD 官方 ROCm 與 HIP 文件基礎,包括 ROCm、HIP 及 ROCm LLVM 等專案。
🎯 學習目標
- 用一句簡潔的句子定義 HIP 及其在 ROCm 生態系統中的角色。
- 区分 ROCm(平台)、HIP(介面)與 ROCm 函式庫(組成元件)。
- 識別從硬體到應用框架之間,ROCm 架構的層級結構。
- 定義 HIP SDK 與不同作業系統上 ROCm 平台的關係。
- 執行系統性的安裝流程,包含支援矩陣驗證與安裝後路徑設定。
- 編譯並執行一個最小化驗證程式,以排除常見的驅動程式與環境存取問題。
- 理解健全的建置策略對於調和原始碼可移植性與架構特定效能的重要性。
- 使用
hipLaunchKernelGGL宏來實現可移植的核心啟動,作為取代 CUDA 三重尖括號語法的替代方案。 - 設定針對特定 ROCm 架構的生產級 CMake 專案,並管理外部函式庫依賴。
- 解析 HIP 核心的組成結構,並套用基本的線程索引執行公式。
🔹 第一課:ROCm 與 HIP 架構入門
概述: 本課程提供 ROCm 平台與 HIP 程式語言的基礎概觀。釐清完整 ROCm 堆疊、HIP 介面與高階函式庫之間的關係,同時建立對 CUDA 移植至 AMD 的合理期望,以及效能工程的現實考量。
學習成果:
- 用一句簡潔的句子定義 HIP 及其在 ROCm 生態系統中的角色。
- 区分 ROCm(平台)、HIP(介面)與 ROCm 函式庫(組成元件)。
- 識別從硬體到應用框架之間,ROCm 架構的層級結構。
🔹 第二課:安裝與環境設定
概述: 本課程指導 GPU 開發者與高效能運算(HPC)工程師,在 Linux 與 Windows 平台上設立適合 HIP 開發的環境。強調「平台現實」方法,開發者必須在進行結構化安裝流程前,先驗證硬體/軟體相容性,並利用 hipcc 編譯器完成最終驗證。
學習成果:
- 定義 HIP SDK 與不同作業系統上 ROCm 平台的關係。
- 執行系統性的安裝流程,包含支援矩陣驗證與安裝後路徑設定。
- 編譯並執行一個最小化驗證程式,以排除常見的驅動程式與環境存取問題。
🔹 第三課:建置工具鏈:hipcc 與專案架構
概述: 本課程探討在 AMD 硬體上開發 HIP 應用所需的核心工具鏈與組織策略。引導開發者從使用 hipcc 驅動程式的簡單命令列建置,轉向使用 CMake 建立專業且可投入生產的專案配置。重點包括可移植的核心啟動宏、架構特定的優化,以及原始碼層級可移植性與二進位效能之間的關鍵差異。
學習成果:
- 理解健全的建置策略對於調和原始碼可移植性與架構特定效能的重要性。
- 使用
hipLaunchKernelGGL宏實現可移植的核心啟動,作為取代 CUDA 三重尖括號語法的替代方案。 - 設定針對特定 ROCm 架構的生產級 CMake 專案,並管理外部函式庫依賴。
🔹 第四課:HIP 程式模型與核心開發
概述: 本課程探討 HIP 核心的基本架構,聚焦於如何透過格網(grid)與區塊(block)將邏輯問題映射至硬體執行。提供穩健的 GPU 程式設計藍圖,涵蓋基本的執行公式、效能瓶頸(記憶體與計算)、以及為生產環境代碼所必需的錯誤檢查與同步機制。
學習成果:
- 解析 HIP 核心的組成結構,並套用基本的線程索引執行公式。
- 有效設定格網與區塊大小,並實作基準測試以尋找最佳吞吐量。
- 實現穩健的錯誤處理巨集,並套用同步語意以管理裝置與主機之間的互動。
🔹 第五課:記憶體管理與資料模式
概述: 本課程聚焦於 GPU 程式設計的核心支柱:記憶體管理。內容涵蓋記憶體類型(可分頁、固定、裝置、共用)的分類、資料傳輸機制的效能影響,以及記憶體存取模式——特別是資料合併(coalescing)——在達成最高效能中的關鍵作用。學員將學習如何在共用記憶體的便利性與高階 HPC 應用所需的明確控制之間取得平衡。
學習成果:
- 區分可分頁與固定主機記憶體,並判斷何時使用以達到最佳傳輸速度。
- 使用 HIP API(
hipMalloc、hipHostMalloc、hipMallocManaged)實作裝置記憶體配置與統一/共用記憶體。 - 分析記憶體存取模式,確保資料合併存取,避免如間距存取等效能瓶頸。
🔹 第六課:串流、事件與非同步執行
概述: 本課程協助開發者從同步程式設計模型過渡到並行思維,著重於如何透過 HIP 串流與事件最大化 GPU 使用率。內容包括透過分段式管道重疊資料傳輸與核心執行的機制,並介紹串流捕捉與顯式圖形建構之間的權衡。此外,也強調重要的生產環境考量,例如使用圖形安全的函式庫與在 GPU 上進行高精度計時。
學習成果:
- 識別非同步執行與並行串流相比同步執行的效能優勢。
- 實作分段式管道,以重疊主機至裝置的通訊與核心運算。
- 区分串流捕捉與顯式圖形建構,以降低啟動開銷。
🔹 第七課:AMD GPU 上的效能工程
概述: 本課程建立一套科學的軟體優化框架,針對 AMD 硬體進行系統性、以量測為導向的優化,超越猜測,走向精確分析。內容涵蓋計算單元(Compute Units)、波前(wavefronts)與暫存器壓力之間的架構關係,並提供使用 rocprofv3 進行剖析的實用方法,以及建立穩健基準測試骨架的技巧。
學習成果:
- 實作六步驟的 HIP 優化流程,以識別並解決效能瓶頸。
- 分析暫存器壓力與佔用率之間的權衡,以最大化硬體利用率。
- 使用硬體事件與多迭代基準測試的最佳實務,執行精確的效能量測。
🔹 第八課:ROCm 函式庫生態系
概述: 本課程介紹「函式庫優先」的工程哲學,強調優先使用高效率、預先建構的 ROCm 函式庫,而非自行開發核心。內容涵蓋 ROCm 函式庫堆疊的分類(數學、FFT、基本運算、機器學習/人工智慧),並提供選擇可移植的 hip* 介面或 AMD 原生的 roc* 實作之決策框架。此外,學員將探討在整合函式庫至 HIP 圖形捕捉工作流程時,「圖形安全性」的關鍵要求。
學習成果:
- 應用「函式庫優先」的工程原則,說明使用經過測試的基礎運算元件,勝過自訂核心的理由。
- 根據可移植性需求與效能需求,區分
hip*與roc*函式庫。 - 將 ROCm 函式庫分類至其各自的功用領域(數學、FFT、基本運算、機器學習/人工智慧)。
🔹 第九課:將 CUDA 應用程式移植至 HIP
概述: 本課程介紹將 CUDA 原始碼系統性轉換為可移植的 HIP C++ 框架的流程。學員將學習使用自動化工具(如 hipify-perl 與 hipify-clang)執行逐步移植流程,辨識關鍵的可移植性陷阱,例如對硬體特定的 warpSize 假設,並建立嚴謹的驗證程序,以比較遷移後的效能與正確性。
學習成果:
- 執行六步驟的逐步移植流程,以最小化除錯負擔。
- 根據原始碼複雜度,選擇並應用適當的自動化翻譯工具(
hipify-perl與hipify-clang)。 - 辨識並解決與架構相關的「可移植性陷阱」,特別是涉及
warpSize與機械翻譯錯誤的部分。
🔹 第十課:除錯、測試與生產實務
概述: 本課程介紹將 GPU 核心從開發階段轉移到生產環境所需的關鍵工具與方法論。詳述如何使用 ROCgdb 與 AddressSanitizer 進行錯誤偵測,建立嚴謹的四層測試策略,並提供一份生產檢查清單,以確保核心的正確性與效能穩定性。
學習成果:
- 使用 ROCgdb、ltrace 與 AddressSanitizer 來識別 GPU 程式碼中的原始碼錯誤與記憶體存取錯誤。
- 實作 四層測試策略,以驗證輔助函式、核心正確性、邊界案例與效能退化。
- 應用 生產程式碼模式 與檢查清單,以管理核心介面、文件編寫與環境驅動的除錯。