DPC++ 在 Nvidia GPU 上的展示 - 實機演示
目錄
- 導言
- 安裝前準備
- 範例一:基本向量加法
- 範例二:使用現有 CUDA API 的 Sickle 中斷
- 範例三:將 CUDA Kernel 整合入 Sickle 專案
- 練習一:將 sgmv 函數從 CUDA 轉換為 Sickle
- 結論
- 常見問題解答 (FAQ)
導言
大家好,歡迎來到這個 DPC++ 的實作練習!我叫 Stuart Adams,是 Codeplay Software 的軟體工程師,我將在這裡展示我和同事們在過去幾個月對 DPC++ 專案的貢獻。在開始之前,我想要明確指出這些練習只能在裝有 Nvidia GPU 的 Linux 系統上執行,無法在 Windows 或 Windows Subsystem for Linux 上運作。所以,如果你想要跟著我一起進行,你需要在安裝 Nvidia GPU 的 Linux 環境中操作。熟悉 C++ 程式語言對於理解這些教材也是必要的。
為了進行我們的範例,建議先安裝 Docker 和 Nvidia Container Toolkit。這些工具將幫助你運行一個包含所需函式庫和環境變數的容器,讓你更容易地使用 DPC++。如果你之前沒有安裝過 Docker 和 Toolkit,我們在文中附上了一個指南連結,幫助你完成安裝。整個過程只需要大約五分鐘。
安裝完 Docker 和 Nvidia Container Toolkit 後,我們就可以開始了。只需運行指令來建立一個新的容器,然後我們就可以在裡面運行範例了。現在,讓我們進入到容器內部,找到已經安裝範例的目錄。範例位於 home/examples/sickle-for-cuda-examples
路徑下。在這裡,我們將運行所有的範例,然後繼續進行練習。
第一個範例提供了使用 Sickle 和 CUDA 的基本向量加法實現。通過研究這個範例,你將對這兩個 API 之間的差異有一個很好的了解。讓我們首先構建這個範例。我們先建立一個新的 build 目錄,然後運行 cmake。我建議你直接複製這裡的指令,因為我們需要指定 Sickle 的根路徑,這是指定你的 Sickle 實現所在位置的好習慣。現在,cmake 已經執行完畢,我們運行 make 命令,你可以看到我們現在有了兩個可執行文件,一個用於 CUDA,一個用於 Sickle。
🚀 範例一:基本向量加法
現在,讓我們來看一個更有趣的例子。範例二展示了如何從現有的 CUDA API 中斷到 Sickle 專案中。我們使用的 CUDA API 是 kublas,它是建立在 CUDA 上的線性代數庫。這個例子只是呼叫了 sgm API,據我所知,這個 API 是用於矩陣相乘。這裡有兩個程式,你可以比較一下如何從 CUDA 和 Sickle 中調用 kublas。
Sickle 應用程式使用了我們引入的一些新增中斷功能,例如 interrupt task
。interrupt task
就是將所有原生處理器從中斷處理程序中提取出來,然後直接傳遞給 kublas API。讓我們建構這個範例,步驟與之前相同。
🚀 範例二:使用現有 CUDA API 的 Sickle 中斷
建立一個新的 build 目錄,執行相同的 cmake 指令,然後運行 make。這樣我們就有了兩個可執行文件,準備好使用。
🚀 範例三:將 CUDA Kernel 整合入 Sickle 專案
範例三也非常有趣,因為我們將再次看向量加法示例,但有一個小變化。此範例不再使用 Sickle 內核,而是使用 CUDA 內核。儘管代碼仍然使用 Sickle API 進行設置,但我們直接通過中斷任務調用了這個 CUDA 內核。要構建這個範例,我們只需要運行 make 命令。
這個範例使用 make 而不是 cmake,原因是 cmake 目前沒有辦法更改 CUDA 編譯器。
🚀 練習一:將 sgmv 函數從 CUDA 轉換為 Sickle
現在,希望通過研究所有這些範例,你已經對我們引入的新的中斷功能有了相當清晰的理解。現在,讓我們看看練習。就像範例二展示了如何從 Sickle 中斷到現有的 CUDA API 一樣,練習一鼓勵你實現類似功能。也就是說,練習一提供了一個 Sickle 應用程式,可以呼叫 kublas,并調用 sgm 函數。而練習一則要你做類似的事情,但不是呼叫 sgm,而是呼叫 sgmv。
我們已經提供了一個達到同樣目的的 CUDA 應用程式,現在你需要弄清楚如何將這段 CUDA 代碼轉換為 Sickle。你可以參考範例二的代碼,瞭解它是如何改變和適應以在 Sickle 中工作的。然後根據同樣的邏輯,呼叫 sgmv,而不是 sgm。如果你有任何問題,我們會在 DevMash Discord 伺服器上提供幫助,討論這些練習以及我們在 DPC++ 上的工作。
希望你能從這個練習中學到更多關於 DPC++ 的知識!這次練習的過程已經錄製下來,我們也會在 YouTube 上發布一份連結,這樣你可以自己按步驟進行,隨時重溫。
非常感謝你的觀看,希望你對 DPC++ 的理解更深了!
結論
通過這些範例和練習,你應該對於 DPC++ 編程以及在 Sickle 和 CUDA 專案之間的中斷有了更清晰的理解。這將幫助你在實際應用中更好地運用 DPC++。
常見問題解答 (FAQ)
Q: 這些範例只能在 Linux 系統上運行嗎?
A: 是的,由於需要 Nvidia GPU 的支持,這些範例只能在裝有 Nvidia GPU 的 Linux 系統上運行。
Q: 是否必須熟悉 C++ 程式語言才能理解這些範例?
A: 是的,熟悉 C++ 程式語言對於理解這些範例是必要的。
Q: 我需要安裝 Docker 和 Nvidia Container Toolkit 嗎?
A: 是的,建議安裝 Docker 和 Nvidia Container Toolkit,以便運行包含所需函式庫和環境變數的容器。
Q: 我可以在 Windows 系統上運行這些範例嗎?
A: 不可以,這些範例只能在裝有 Nvidia GPU 的 Linux 系統上運行。
Q: 我能夠在 Windows Subsystem for Linux 上運行這些範例嗎?
A: 不可以,這些範例不適用於 Windows Subsystem for Linux。
Q: 我能否僅僅使用 CUDA,而不使用 Sickle?
A: 是的,你仍然可以在這些範例中使用 CUDA,但我們鼓勵你了解並嘗試 Sickle,以便瞭解它的優勢和特點。
Q: 如果在練習中遇到問題,可以向誰尋求幫助?
A: 在 DevMash Discord 伺服器上可以找到我們,我們樂意為你解答關於練習和 DPC++ 的問題。