Skip to content

Commit e16e152

Browse files
jerrycchounode
authored andcommitted
Update on Overleaf.
1 parent a50a119 commit e16e152

23 files changed

+739
-700
lines changed

Appendici/AppendiceA.tex

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ \section{先備條件}
2828
\end{table}
2929

3030

31-
需要執行 GPU 程式的系統使用者必須加入適當的使用者群組。可以使用 groups 指令來檢查目前使用者所屬的群組。若要使用 GPU,使用者需加入 \lstinline|render| 或 \lstinline|video|(推薦)群組之一。可以使用指令 \lstinline|sudo usermod -a -G [group_name] [user_name]| 來將使用者加入特定的群組。
31+
需要執行 GPU 程式的系統使用者必須加入適當的使用者群組。可以使用 groups 指令來檢查目前使用者所屬的群組。若要使用 GPU,使用者需加入 \lstinline|render| 或 \lstinline|video|(推薦)群組之一。可以使用指令 \lstinline|sudo usermod -a -G [群組名稱] [使用者名稱]| 來將使用者加入特定的群組。
3232

3333
在購買 GPU 硬體之前,應確認預計要購買的 GPU 是否被 ROCm 平台所之援(請參閱表格 \ref{table:rocm_supported_gpus})。
3434

@@ -52,12 +52,12 @@ \section{先備條件}
5252

5353
\section{理解 ROCm 套件}
5454

55-
ROCm 是一個包含許多軟體套件的複雜生態系統。完整的套件列表可以參見圖 \ref{fig:rocm_packages}。這些套件可能有複雜的依賴性關係。為了避免使用者需要逐一安裝套件,ROCm 將這些套件分組為元套件(完整列表請參見表格 \ref{table:rocm_meta_packages})。使用者通常會選擇安裝元套件,而非單獨安裝各個套件
55+
ROCm 是一個包含許多軟體套件的複雜生態系統。完整的套件列表可以參見圖 \ref{fig:rocm_packages}。這些套件可能有複雜的依賴性關係。為了避免使用者需要逐一安裝套件,ROCm 將這些套件分組為元套件 (meta-package)(完整列表請參見表格 \ref{table:rocm_meta_packages})。使用者通常會選擇安裝元套件,而非獨立安裝各個套件
5656

5757
\begin{figure}
5858
\centering
59-
\includegraphics[width=1\linewidth]{Appendici/FigureA1.png}
60-
\caption{ROCm 元套件的列表以及包含在元套件中的各個單獨套件}
59+
\includegraphics[width=1\linewidth]{Appendici/MetaPackages.png}
60+
\caption{ROCm 元套件的列表以及包含在元套件中的各個獨立套件}
6161
\label{fig:rocm_packages}
6262
\end{figure}
6363

@@ -76,7 +76,7 @@ \subsection{安裝程式腳本方法}
7676
sudo apt-get install ./amdgpu-install_5.4.50403-1_all.deb
7777
\end{lstlisting}
7878

79-
上述指令應該會安裝一個可以幫助管理 ROCm 套件的 \lstinline|amdgpu-install| 程式。如要安裝 ROCm,我們可以使用 \lstinline|sudo ./amdgpu-install| 指令執行安裝。此外,使用者也可以透過像是 \lstinline|sudo amdgpu-install --usecase=rocm| 的指令來安裝特定的使用案例。如果使用者希望一次安裝多個使用案例,可以在 \lstinline|usecase| 參數中指定多個值,並以逗號分隔。例如,指令 \lstinline|sudo amdgpu-install --usecase=rocm,hiplibsdk| 會同時安裝 ROCm 和 \lstinline|hiplibsdk| 兩個使用案例。使用 \lstinline|sudo amdgpu-install --list-usecase| 可以顯示所有可用的使用案例列表
79+
上述指令應該會安裝一個可以幫助管理 ROCm 套件的 \lstinline|amdgpu-install| 程式。如要安裝 ROCm,我們可以使用 \lstinline|sudo ./amdgpu-install| 指令執行安裝。此外,使用者也可以透過像是 \lstinline|sudo amdgpu-install --usecase=rocm| 的指令來安裝特定的使用案例。如果使用者希望一次安裝多個使用案例,可以在 \lstinline|usecase| 參數中指定多個值,並以逗號分隔。例如,指令 \lstinline|sudo amdgpu-install --usecase=rocm,hiplibsdk| 會同時安裝 ROCm 和 \lstinline|hiplibsdk| 兩個使用案例。使用 \lstinline|sudo amdgpu-install --list-usecase| 可以顯示所有可用的使用案例的列表
8080

8181

8282
\subsection{套件管理器方法}
@@ -93,7 +93,7 @@ \subsection{套件管理器方法}
9393

9494

9595
\paragraph{步驟 2:安裝 AMD GPU 驅動程式}
96-
接下來,我們會使用套件管理器安裝 AMD GPU 驅動程式。套件管理器要求套件必須加密,因此需要安裝一組GNU Privacy Guard(GPG)金鑰。安裝 GPG 金鑰的指令為:
96+
接下來,我們會使用套件管理器安裝 AMD GPU 驅動程式。套件管理器要求套件必須加密,因此需要安裝一組 GNU Privacy Guard(GPG)金鑰。安裝 GPG 金鑰的指令為:
9797

9898
\lstinline!curl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/rocm-keyring.gpg!。
9999

@@ -123,7 +123,7 @@ \subsection{驗證安裝}
123123
首先,我們可以檢查 \lstinline|/opt/rocm|目錄是否包含預期的執行檔,例如 \lstinline|rocm-smi|,以及 ROCm 函式庫,例如 \lstinline|librocblas.so|。
124124
其次,我們可以檢查驅動程式是否正常運作。可以使用 \lstinline|dkms status| 指令檢查目前正在使用的驅動程式。例如,在作者的系統中,執行此指令會顯示輸出:\lstinline|amdgpu, 5.16.9.22.20-1438746~20.04, 5.4.0-121-generic, x86_64: installed|。這表示驅動程式已正確安裝並正在使用。
125125

126-
再者,我們應該檢查是否有程式能夠偵測到 GPU 硬體並取得 GPU 的屬性。我們可以執行 \lstinline|/opt/rocm/bin/rocminfo| 或 \lstinline|/opt/rocm/opencl/bin/clinfo| 來取得硬體屬性。如果這兩個程式能夠順利執行並且顯示系統中安裝的 GPU,則表示 ROCm 環境已正確安裝並且正常運作。
126+
再來,我們應該檢查是否有程式能夠偵測到 GPU 硬體並取得 GPU 的屬性。我們可以執行 \lstinline|/opt/rocm/bin/rocminfo| 或 \lstinline|/opt/rocm/opencl/bin/clinfo| 來取得硬體屬性。如果這兩個程式能夠順利執行並且顯示系統中安裝的 GPU,則表示 ROCm 環境已正確安裝並且正常運作。
127127

128128
最後,我們可以使用平常的 Ubuntu 套件安裝指令來安裝元套件。指令為 \lstinline|sudo apt install <套件名稱>|。例如,如果我們想安裝最常使用的 ROCm 功能,可以使用 \lstinline|sudo apt install rocm|。
129129

@@ -145,7 +145,7 @@ \section{更新 ROCm}
145145

146146
\lstinline!echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' | sudo tee /etc/apt/preferences.d/rocm-pin-600!
147147

148-
接著,我們可以使用套件管理器更新 ROCm 套件,指令為:\lstinline|sudo apt install --only-upgrade <元套件名稱>|。
148+
接著,我們可以使用套件管理器更新 ROCm 套件,指令為:\lstinline|sudo apt install --only-upgrade <套件名稱>|。
149149

150150
\section{解除安裝 ROCm}
151151
若要解除安裝 ROCm,我們可以選擇使用安裝程式腳本(在這種情況下是解除安裝程式)或是 Linux 發行版的套件管理器。如果 ROCm 是透過安裝程式腳本安裝的,解除安裝程式會與安裝程式一併提供。解除安裝 ROCm 只需執行 \lstinline|sudo amdgpu-uninstall| 即可。

Appendici/AppendiceB.tex

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ \subsection{提取 \term{HIP} kernel 二進位程式碼}
2323

2424
HIP 編譯器 \lstinline|hipcc| 會將 GPU 程式編譯 fat binary,其中包含主機端和 GPU 端的二進位程式碼。
2525
若要查看 GPU 組合語言程式碼,首先需要查看編譯後的 HIP 二進位檔案中嵌入的 GPU 程式。ROCm 提供了 \lstinline|roc-obj-ls| 工具,該工具可列出嵌入的 GPU 程式。例如,如果執行命令 \lstinline|roc-obj-ls main|,
26-
其中 \lstinline|main| 是執行影像伽瑪校正任務(參見第 \ref{sec:gamma_correction} 節)所用的執行檔,則輸出中每一行都會包含嵌入程式的描述(如: \lstinline|hipv4-amdgcn-amd-amdhsa–gfx908|),以及通用資源識別碼(URI, 如:\lstinline|file://main#offset=24576&size=9936|)。
26+
其中 \lstinline|main| 是執行影像伽瑪校正任務(參見第 \ref{sec:gamma_correction} 節)所用的執行檔,則輸出中每一行都會包含嵌入程式的描述(如: \lstinline|hipv4-amdgcn-amd-amdhsa–gfx908|),以及通用資源識別碼(URI, 如:\lstinline|file://main#offset=24576&size=9936|)。
2727
該 URI 提供了嵌入程式的位置與大小資訊。
2828
接下來,使用 ROCm 提供的 \lstinline|roc-obj-extract| 工具,根據 \lstinline|roc-obj-ls| 輸出的 URI 提取 GPU 程式作為獨立檔案。
2929
在這個範例中,我們使用指令 \lstinline|roc-obj-extract "file://main#offset=24576&size=9936"|。輸出會儲存為 \lstinline|main-offset24576-size9936.co| 檔案。
@@ -61,7 +61,7 @@ \section{CDNA 暫存器}
6161

6262
\section{指令類型}
6363

64-
CDNA 指令集將指令分類為少數幾類,不同類別的指令通常需要不同的硬體單元來執行:
64+
CDNA 指令集將指令分類為幾個類別,不同類別的指令通常需要不同的硬體單元來執行:
6565

6666
純量指令(Scalar Instructions)用來表示由 wavefront 中所有 work item 共享的整數運算。執行純量指令時只處理一筆資料,且純量指令僅能存取純量暫存器。例如,\lstinline|s_add_u32 s0, s1, s2| 是一個將 \lstinline|s1| 和 \lstinline|s2| 中的兩個無號整數相加並將結果儲存回 \lstinline|s0| 的指令。
6767

@@ -81,7 +81,7 @@ \section{指令類型}
8181
\section{記憶體存取指令}
8282
\label{sec:memory_access_instructions}
8383

84-
記憶體指令可以為純量或是向量。最常見的記憶體操作類型為載入和儲存類型,不可分割操作(atomic operations)也被視為記憶體指令。
84+
記憶體指令可以為純量或是向量。最常見的記憶體操作類型為載入和儲存。不可分割操作(atomic operations)也被視為記憶體指令。
8585

8686
GPU 記憶體操作通常涉及較長的延遲,依賴於執行緒層級的平行來隱藏記憶體存取的成本。當一個 wavefront 等待記憶體存取時,CU 可以執行來自另一個 wavefront 的指令。然而,在許多情況下,執行緒層級的平行度可能不足,CU 可能會閒置。為了避免這種情況,MI100 GPU 利用指令層級的平行。MI100 的 CU 在等待記憶體存取完成時,可以執行同一個 wavefront 中其他類型的指令。
8787

@@ -94,15 +94,15 @@ \section{記憶體存取指令}
9494
\begin{lstlisting}[caption={記憶體載入的偽程式碼}]
9595
global_load [data1]
9696
global_load [data2]
97-
# Some calculation
97+
# 某些運算
9898
waitcnt vmcnt(1)
99-
# Use [data1]
99+
# 使用 [data1]
100100
waitcnt vmcnt(0)
101-
# Use [data2]
101+
# 使用 [data2]
102102
\end{lstlisting}
103103

104104
執行第 1 行和第 2 行後,VMCNT 的值分別為 1 和 2。我們接著可以執行其他指令。在使用 \lstinline|data1| 之前,我們於第 4 行插入一行等待 VMCNT 的值變為 1 或更小的指令。當 VMCNT 的值為 1 時,只有 \lstinline|data1| 可以使用,而 \lstinline|data2| 尚未取得。此時,我們可以完成 \lstinline|data1| 的處理,無需等待 \lstinline|data2|。
105-
最後,在第 6 行,我們等待 VMCNT 的值回到 0,以能夠使用 \lstinline|data2|。這種機制允許進行細緻的同步控制,代價是要求同一 wavefront 的記憶體存取必須按照順序返回。
105+
最後,在第 6 行,我們等待 VMCNT 的值回到 0,以能夠使用 \lstinline|data2|。這種機制可以進行細緻的同步控制,而代價是要求同一 wavefront 的記憶體存取必須按照順序返回。
106106

107107

108108
\section{範例:位移複製}
@@ -194,7 +194,7 @@ \section{比較 CDNA2 與 CDNA3}
194194

195195
MI200 系列作為 AMD CDNA2 架構的一部分,是一款以計算為優化目標的 GPU 設計。其中的關鍵特性是簡化了 IMAGE(MIMG)操作。此架構僅保留了一組核心的操作碼,如 \lstinline|IMAGE_LOAD|、\lstinline|IMAGE_STORE| 與多種 \lstinline|IMAGE_ATOMIC| 的操作,將圖形相關指令簡化為常見的計算操作。
196196

197-
CDNA2 微架構改變了 GPU 上可用的暫存器設計。在 CDNA1 架構中,累加向量通用暫存器(ACCVGPR)為一組獨立的暫存器,專為加速累加器單元使用的矩陣操作而設計。ACCVGPR 實體位於專用的暫存器檔案中,與一般的向量通用暫存器(VGPR)分離。由於與 VGPR 不相連,ACCVGPRs 無法直接使用標準 SIMD 指令進行寫入。在 CDNA2 中,ACCVGPR 與 VGPR 共用相同的實體暫存器池,允許 ACCVGPR 作為記憶體載入指令的目標暫存器,簡化了資料處理並提高了累加操作的效率。
197+
CDNA2 微架構改變了 GPU 上擁有的暫存器設計。在 CDNA1 架構中,累加向量通用暫存器(ACCVGPR)為一組獨立的暫存器,專為加速累加器單元使用的矩陣操作而設計。ACCVGPR 實體位於專用的暫存器檔案中,與一般的向量通用暫存器(VGPR)分離。由於與 VGPR 不相連,ACCVGPRs 無法直接使用標準 SIMD 指令進行寫入。在 CDNA2 中,ACCVGPR 與 VGPR 共用相同的實體暫存器池,允許 ACCVGPR 作為記憶體載入指令的目標暫存器,簡化了資料處理並提高了累加操作的效率。
198198

199199
CDNA2 ISA 增強了矩陣操作、Data Parallel Primitives (DPP) 與 Packed Math 等提供新的計算能力的專門指令。矩陣指令利用 CDNA GPU 新增的矩陣核心,能在單個指令中完成小矩陣的乘法運算。CDNA2 還新增對更多矩陣大小的支援(詳見表 \ref{tab:matrix_sizes_cdna2})。DPP 是現有指令的修飾符,允許執行緒存取同一 wavefront 內其他執行緒的暫存器。CDNA2 增加了對 64 位元資料類型的 DPP 支援。此外,AMD 擴展了 Packed Math 指令的功能(使其能夠在單一指令中執行多項操作),並新增了對單精度運算的支援(此前僅支援低精度數學運算)。
200200

@@ -218,7 +218,7 @@ \section{比較 CDNA2 與 CDNA3}
218218
\end{tabular}
219219
\end{table}
220220

221-
CDNA3 指令集進一步減少了對圖形相關功能的支援,並增加了新的計算功能。例如,在 CDNA3,AMD 移除了所有圖形與取樣指令。同時,新增了多項記憶體與計算相關的功能。其中一項重大的改進是在 CDNA 架構內增加了新的矩陣操作,新增了如 \lstinline|V_MFMA_F32_16X16X16_XF32| 與 \lstinline|V_MFMA_F32_32X32X8_XF32| 等指令。對於 AMD 而言,這是對在神經網路模型中十分常見的低精度乘法的支援邁出了一大步。這些指令在操作單精度浮點數時,能大幅降低延遲與能耗。此外,為了滿足對精度需求較低但仍要求高效能的應用程式,矩陣核心延伸支援了 8 位元浮點數,包括 BF8(5 位元的 exponent 與 2 位元的 mantissa)與 FP8(4 位元的 exponent 與 3 位元的 mintissa)。此外,CDNA3 ISA 通過創新的 \lstinline|SMFMA| 指令支援稀疏矩陣運算,進一步提升在專用計算任務中的效率與效能。
221+
CDNA3 指令集進一步減少了對圖形相關功能的支援,並增加了新的計算功能。例如,在 CDNA3,AMD 移除了所有圖形與取樣指令。同時,新增了多項記憶體與計算相關的功能。其中一項重大的改進是在 CDNA 架構內增加了新的矩陣操作,新增了如 \lstinline|V_MFMA_F32_16X16X16_XF32| 與 \lstinline|V_MFMA_F32_32X32X8_XF32| 等指令。對於 AMD 而言,這是對在神經網路模型中十分常見的低精度乘法的支援邁出了一大步。這些指令在操作單精度浮點數時,能大幅降低延遲與能耗。此外,為了滿足對精度需求較低但仍要求高效能的應用程式,矩陣核心延伸支援了 8 位元浮點數,包括 BF8(5 位元的指數 (exponent) 與 2 位元的尾數 (mantissa))與 FP8(4 位元的指數 與 3 位元的尾數)。此外,CDNA3 ISA 通過創新的 \lstinline|SMFMA| 指令支援稀疏矩陣運算,進一步提升在專用計算任務中的效率與效能。
222222

223223

224224
\section{結論}

0 commit comments

Comments
 (0)