GPU 硬件簡介
從十多年前起,GPU 的浮點(diǎn)數(shù)運(yùn)算峰值就比同時(shí)期的 CPU 高一個(gè)量級;GPU 的內(nèi)存帶寬峰值也比同時(shí)期的 CPU 高一個(gè)量級。
CPU 和 GPU 的顯著區(qū)別是:一個(gè)典型的 CPU 擁有少數(shù)幾個(gè)快速的計(jì)算核心,而一個(gè)典型的 GPU 擁有幾百到幾千個(gè)不那么快速的計(jì)算核心。CPU 中有更多的晶體管用于數(shù)據(jù)緩存和流程控制,但 GPU 中有更多的晶體管用于算術(shù)邏輯單元。
所以,GPU 是靠眾多的計(jì)算核心來獲得相對較高的計(jì)算性能的。圖 1.1 形象地說明了(非集成) GPU 和 CPU 在硬件架構(gòu)上的顯著區(qū)別。
GPU 計(jì)算不是指單獨(dú)的 GPU 計(jì)算,而是指 CPU + GPU 的異構(gòu)(heterogeneous)計(jì)算。
一塊單獨(dú)的 GPU 是無法獨(dú)立地完成所有計(jì)算任務(wù)的,它必須在 CPU 的調(diào)度下才能完成特定任務(wù)。在由 CPU 和 GPU 構(gòu)成的異構(gòu)計(jì)算平臺中,通常將起控制作用的 CPU 稱為主機(jī)(host),將起加速作用的 GPU 稱為設(shè)備(device)。主機(jī)和(非集成)設(shè)備都有自己的 DRAM(dynamic random-access memory,動態(tài)隨機(jī)存取內(nèi)存),它們之間一般由 PCIe 總線(peripheral component interconnect express bus)連接,如圖 1.1 所示。
本書中說的 GPU 都是指英偉達(dá)(Nvidia)公司推出的 GPU,因?yàn)?CUDA 編程目前只支持該公司的 GPU。以下幾個(gè)系列的 GPU 都支持 CUDA 編程:
? Tesla 系列:其中的內(nèi)存為糾錯(cuò)內(nèi)存(error-correcting code memory,ECC 內(nèi)存),穩(wěn)定性好,主要用于高性能、高強(qiáng)度的科學(xué)計(jì)算。
? Quadro 系列:支持高速 OpenGL 渲染,主要用于專業(yè)繪圖設(shè)計(jì)。
? GeForce 系列:主要用于游戲與娛樂,但也常用于科學(xué)計(jì)算。GeForce 系列的 GPU 沒有糾錯(cuò)內(nèi)存,用于科學(xué)計(jì)算時(shí)具有一定的風(fēng)險(xiǎn)。然而,GeForce 系列的 GPU 價(jià)格相對低廉、性價(jià)比高,用于學(xué)習(xí) CUDA 編程是沒有任何問題的。即使是便攜式計(jì)算機(jī)中 GeForce 系列的 GPU 也可以用來學(xué)習(xí) CUDA 編程。
? Jetson 系列:嵌入式設(shè)備中的 GPU。作者對此無使用經(jīng)驗(yàn),本書也不專門討論。
每一款 GPU 都有一個(gè)用以表示其“計(jì)算能力”(compute capability)的版本號。該版本號可以寫為形如 X.Y 的形式。其中,X 表示主版本號,Y 表示次版本號。版本號決定了 GPU 硬件所支持的功能,可為應(yīng)用程序在運(yùn)行時(shí)判斷硬件特征提供依據(jù)。
初學(xué)者往往誤以為 GPU 的計(jì)算能力越高,性能就越高,但后面我們會看到,計(jì)算能力和性能沒有簡單的正比關(guān)系。
CUDA 程序開發(fā)工具
CUDA 編程語言最初主要是基于 C 語言的,但目前越來越多地支持 C++ 語言。還有基于 Fortran 的 CUDA Fortran 版本及由其他編程語言包裝的 CUDA 版本,但本書只涉及基于 C++ 的 CUDA 編程。我們稱基于 C++ 的 CUDA 編程語言為 CUDA C++。
對 Fortran 版本感興趣的讀者可以參考網(wǎng)站 https://www.pgroup.com/。用戶可以免費(fèi)下載支持 CUDAFortran 編程的 PGI 開發(fā)工具套裝的社區(qū)版本(Community Edition)。對應(yīng)的還有收費(fèi)的專業(yè)版本(Professional Edition)。PGI 是高性能計(jì)算編譯器公司 Portland Group, Inc. 的簡稱,已被英偉達(dá)公司收購。
CUDA 提供了兩層 API(Application Programming Interface,應(yīng)用程序編程接口)給程序員使用,即 CUDA 驅(qū)動(driver)API 和 CUDA 運(yùn)行時(shí)(runtime)API。
其中,CUDA 驅(qū)動 API 是更加底層的 API,它為程序員提供了更為靈活的編程接口;
CUDA 運(yùn)行時(shí) API 是在 CUDA 驅(qū)動 API 的基礎(chǔ)上構(gòu)建的一個(gè)更為高級的 API,更容易使用。
這兩種 API 在性能上幾乎沒有差別。從程序的可讀性來看,使用 CUDA 運(yùn)行時(shí) API 是更好的選擇。在其他編程語言中使用 CUDA 的時(shí)候,驅(qū)動 API 很多時(shí)候是必需的。因?yàn)樽髡邲]有使用驅(qū)動 API 的經(jīng)驗(yàn),故本書只涉及 CUDA 運(yùn)行時(shí) API
圖 1.2 展示了 CUDA 開發(fā)環(huán)境的主要組件。開發(fā)的應(yīng)用程序是以主機(jī)(CPU)為出發(fā)點(diǎn)的。
應(yīng)用程序可以調(diào)用 CUDA 運(yùn)行時(shí) API、CUDA 驅(qū)動 API 及一些已有的 CUDA 庫。所有這些調(diào)用都將利用設(shè)備(GPU)的硬件資源。
對 CUDA 運(yùn)行時(shí) API 的介紹是本書大部分章節(jié)的重點(diǎn)內(nèi)容;第 14 章將介紹若干常用的 CUDA 庫。
CUDA 版本也由形如 X.Y 的兩個(gè)數(shù)字表示,但它并不等同于 GPU 的計(jì)算能力。
可以這樣理解:CUDA 版本是 GPU 軟件開發(fā)平臺的版本,而計(jì)算能力對應(yīng)著 GPU 硬件架構(gòu)的版本。
CUDA 開發(fā)環(huán)境搭建示例
我們說過,GPU 計(jì)算實(shí)際上是 CPU+GPU(主機(jī) + 設(shè)備)的異構(gòu)計(jì)算。在 CUDA C++ 程序中,既有運(yùn)行于主機(jī)的代碼,也有運(yùn)行于設(shè)備的代碼。
其中,運(yùn)行于主機(jī)的代碼需要由主機(jī)的 C++ 編譯器編譯和鏈接。
所以,除了安裝 CUDA 工具箱,還需要安裝一個(gè)主機(jī)的 C++ 編譯器。在 Windows 中,最常用的 C++ 編譯器是 Microsoft Visual C++ (MSVC),它目前集成在 Visual Studio 中,所以我們首先安裝 Visual Studio。
作者安裝了最高版本的 Visual Studio 2019 16.x。因?yàn)檫@是個(gè)人使用的,故選擇了免費(fèi)的 Community 版本。下載地址為https://visualstudio.microsoft.com/free-developer-offers/。對于 CUDA C++ 程序開發(fā)來說,只需要選擇安裝 Desktop development with C++ 即可。當(dāng)然,讀者也可以選擇安裝更多的組件。
關(guān)于 CUDA,作者選擇安裝 2019 年 8 月發(fā)布的 CUDA Toolkit 10.1 update2。首先,進(jìn)入網(wǎng)址 https://developer.nvidia.com/cuda-10.1-download-archive-update2。
然后根據(jù)提示,做如下選擇:Operating System 項(xiàng)選擇 Windows;Architecture 項(xiàng)選擇 x86_64;Version 項(xiàng)選擇操作系統(tǒng)版本,我們這里是 10;Installer Type 項(xiàng)可以選擇 exe (network) 或者 exe (local),分別代表一邊下載一邊安裝和下載完畢后安裝。
接著,運(yùn)行安裝程序,根據(jù)提示一步一步安裝即可。該版本的 CUDA 工具箱包含一個(gè)對應(yīng)版本的 Nvidia driver,故不需要再單獨(dú)安裝 Nvidia driver。
安裝好 Visual Studio 和 CUDA 后,進(jìn)入到如下目錄(讀者如果找不到 C 盤下的 ProgramData 目錄,可能是因?yàn)闆]有選擇顯示一些隱藏的文件):
C:ProgramDataNVIDIA CorporationCUDA Samplesv10.11_UtilitiesdeviceQuery
然后,用 Visual Studio 2019 打開文件 deviceQuery_vs2019.sln。接下來,編譯(構(gòu)建)、運(yùn)行。若輸出內(nèi)容的最后部分為 Result = PASS,則說明已經(jīng)搭建好 Windows 中的 CUDA 開發(fā)環(huán)境。若有疑問,請參閱 Nvidia 的官方文檔:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows。
在上面的測試中,我們是直接用 Visual Studio 打開一個(gè)已有的解決方案(solution),然后直接構(gòu)建并運(yùn)行。本書不介紹 Visual Studio 的使用,而是選擇用命令行解釋器編譯與運(yùn)行程序。
這里的命令行解釋器指的是 Linux 中的 terminal 或者 Windows 中的 command prompt 程序。
在 Windows 中使用 MSVC 作為 C++ 程序的編譯器時(shí),需要單獨(dú)設(shè)置相應(yīng)的環(huán)境變量,或者從 Windows 的開始(start)菜單中找到 Visual Studio 2019 文件夾,然后單擊其中的“x64 Native Tools Command Prompt for VS 2019”,而從打開一個(gè)加載了 MSVC 環(huán)境變量的命令行解釋器。
在本書的某些章節(jié),需要有管理員的權(quán)限來使用 nvprof 性能分析器。此時(shí),可以右擊“x64 Native Tools Command Prompt for VS 2019”,然后選擇“更多”,接著選擇“以管理員身份運(yùn)行”。
用命令行解釋器編譯與運(yùn)行 CUDA 程序的方式在 Windows 和 Linux 系統(tǒng)幾乎沒有區(qū)別,但為了簡潔起見,本書后面主要以 Linux 開發(fā)環(huán)境為例進(jìn)行講解。雖然如此,Windows 和 Linux 中的 CUDA 編程功能還是稍有差別。我們將在后續(xù)章節(jié)中適當(dāng)?shù)牡胤街赋鲞@些差別。
用 nvidia-smi 檢查與設(shè)置設(shè)備
可以通過 nvidia-smi(Nvidia’s system management interface)程序檢查與設(shè)置設(shè)備。
它包含在 CUDA 開發(fā)工具套裝內(nèi)。該程序最基本的用法就是在命令行解釋器中使用不帶任何參數(shù)的命令 nvidia-smi。
在作者的計(jì)算機(jī)中使用該命令,得到如下文本形式的輸出:
從中可以看出一些比較有用的信息:
? 第一行可以看到 Nvidia driver 的版本及 CUDA 工具箱的版本。
? 作者所用計(jì)算機(jī)中有一型號為 GeForce RTX 2070 的 GPU。該 GPU 的設(shè)備號是 0。該計(jì)算機(jī)僅有一個(gè) GPU。如果有多個(gè) GPU,會將各個(gè) GPU 從 0 開始編號。如果讀者的系統(tǒng)中有多個(gè) GPU,而且只需要使用某個(gè)特定的 GPU(比如兩個(gè)之中更強(qiáng)大的那個(gè)),則可以通過設(shè)置環(huán)境變量 CUDA_VISIBLE_DEVICES 的值在運(yùn)行 CUDA 程序之前選定一個(gè) GPU。假如讀者的系統(tǒng)中有編號為 0 和 1 的兩個(gè) GPU,而讀者想在 1 號 GPU 運(yùn)行 CUDA 程序,則可以用如下命令設(shè)置環(huán)境變量:
$ export CUDA_VISIBLE_DEVICES=1
這樣設(shè)置的環(huán)境變量在當(dāng)前 shell session 及其子進(jìn)程中有效
? 該 GPU 處于 WDDM(windows display driver model )模式。另一個(gè)可能的模式是 TCC(tesla compute cluster),但它僅在 Tesla、Quadro 和 Titan 系列的 GPU 中可選??捎萌缦路绞竭x擇(在 Windows 中需要用管理員身份打開 Command Prompt 并去掉命令中的 sudo):
sudo nvidia-smi -g GPU_ID -dm 1 # 設(shè)置為 TCC 模式
這里,GPU_ID 是 GPU 的編號。
? 該 GPU 當(dāng)前的溫度為 38 攝氏度。GPU 在滿負(fù)荷運(yùn)行時(shí),溫度會高一些。
? 這是 GeForce 系列的 GPU,沒有 ECC 內(nèi)存,故 Uncorr. ECC 為 N/A,代表不適用(not applicable)或者不存在(not available)。
? Compute M. 指計(jì)算模式(compute mode)。該 GPU 的計(jì)算模式是 Default。在默認(rèn)模式中,同一個(gè) GPU 中允許存在多個(gè)計(jì)算進(jìn)程,但每個(gè)計(jì)算進(jìn)程對應(yīng)程序的運(yùn)行速度一般來說會降低。還有一種模式為 E. Process,指的是獨(dú)占進(jìn)程模式(exclusive processmode),但不適用于處于 WDDM 模式的 GPU。在獨(dú)占進(jìn)程模式下,只能運(yùn)行一個(gè)計(jì)算進(jìn)程獨(dú)占該 GPU??梢杂萌缦旅钤O(shè)置計(jì)算模式(在 Windows 中需要用管理員身份打開 Command Prompt 并去掉命令中的 sudo):
sudo nvidia-smi -i GPU_ID -c 1 # 獨(dú)占進(jìn)程模式
這里,-i GPU_ID 的意思是希望該設(shè)置僅僅作用于編號為 GPU_ID 的 GPU;如果去掉該選項(xiàng),該設(shè)置將會作用于系統(tǒng)中所有的 GPU。
關(guān)于 nvidia-smi 程序更多的介紹,請參考如下官方文檔:https://developer.nvidia.com/nvidia-system-management-interface。
CUDA 的官方手冊
任何關(guān)于 CUDA 編程的書籍都不可能替代官方提供的手冊等資料。以下是幾個(gè)重要的官方文檔,請讀者在有一定的基礎(chǔ)之后務(wù)必查閱。限于作者水平,本書難免存在謬誤。當(dāng)讀者覺得本書中的個(gè)別論斷與官方資料有沖突時(shí),當(dāng)以官方資料為標(biāo)準(zhǔn)(官方手冊的網(wǎng)址為 https://docs.nvidia.com/cuda)。在這個(gè)網(wǎng)站,包括但不限于以下幾個(gè)方面的文檔:
? 安裝指南(installation guides)。讀者遇到與 CUDA 安裝有關(guān)的問題時(shí),應(yīng)該仔細(xì)閱讀此處的文檔。
? 編程指南(programming guides)。該部分有很多重要的文檔:– 最重要的文檔是《CUDA C++ Programming Guide》,見以下網(wǎng)址:https://docs.nvidia.com/cuda/cuda-c-programming-guide。– 另一個(gè)值得一看的文檔是《CUDA C++ Best Practices Guide》,見以下網(wǎng)址:https://docs.nvidia.com/cuda/cuda-c-best-practices-guide。– 針對最近的幾個(gè) GPU 架構(gòu)進(jìn)行優(yōu)化的指南,包括以下網(wǎng)址:
https://docs.nvidia.com/cuda/kepler-tuning-guide。
https://docs.nvidia.com/cuda/maxwell-tuning-guide。
https://docs.nvidia.com/cuda/pascal-tuning-guide。
https://docs.nvidia.com/cuda/volta-tuning-guide。
https://docs.nvidia.com/cuda/turing-tuning-guide。
這幾個(gè)簡短的文檔可以幫助有經(jīng)驗(yàn)的用戶迅速了解一個(gè)新的架構(gòu)。
? CUDA API 手冊(CUDA API references)。這里有:– CUDA 運(yùn) 行 時(shí) API 的 手 冊:https://docs.nvidia.com/cuda/cuda-runtime-api。– CUDA 驅(qū)動 API 的手冊:https://docs.nvidia.com/cuda/cuda-driver-api。– CUDA 數(shù) 學(xué) 函 數(shù) 庫 API 的 手 冊:https://docs.nvidia.com/cuda/cuda-math-api– 其他若干 CUDA 庫的手冊。
為明確起見,在撰寫本書時(shí),作者參考的是與 CUDA 10.2 對應(yīng)的官方手冊。
審核編輯:黃飛
-
gpu
+關(guān)注
關(guān)注
28文章
4740瀏覽量
128951 -
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136841 -
編程語言
+關(guān)注
關(guān)注
10文章
1945瀏覽量
34740 -
C++
+關(guān)注
關(guān)注
22文章
2108瀏覽量
73651 -
CUDA
+關(guān)注
關(guān)注
0文章
121瀏覽量
13628
原文標(biāo)題:一文講清楚GPU 硬件與 CUDA 程序開發(fā)工具
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論