<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文詳解GPU硬件與CUDA開發工具

sanyue7758 ? 來源:UDA 編程 ? 2024-03-21 10:15 ? 次閱讀

GPU 硬件簡介

從十多年前起,GPU 的浮點數運算峰值就比同時期的 CPU 高一個量級;GPU 的內存帶寬峰值也比同時期的 CPU 高一個量級。

CPU 和 GPU 的顯著區別是:一個典型的 CPU 擁有少數幾個快速的計算核心,而一個典型的 GPU 擁有幾百到幾千個不那么快速的計算核心。CPU 中有更多的晶體管用于數據緩存和流程控制,但 GPU 中有更多的晶體管用于算術邏輯單元。

所以,GPU 是靠眾多的計算核心來獲得相對較高的計算性能的。圖 1.1 形象地說明了(非集成) GPU 和 CPU 在硬件架構上的顯著區別。

GPU 計算不是指單獨的 GPU 計算,而是指 CPU + GPU 的異構(heterogeneous)計算。

一塊單獨的 GPU 是無法獨立地完成所有計算任務的,它必須在 CPU 的調度下才能完成特定任務。在由 CPU 和 GPU 構成的異構計算平臺中,通常將起控制作用的 CPU 稱為主機(host),將起加速作用的 GPU 稱為設備(device)。主機和(非集成)設備都有自己的 DRAM(dynamic random-access memory,動態隨機存取內存),它們之間一般由 PCIe 總線(peripheral component interconnect express bus)連接,如圖 1.1 所示。

ca8c873c-dd5d-11ee-a297-92fbcf53809c.png

本書中說的 GPU 都是指英偉達(Nvidia)公司推出的 GPU,因為 CUDA 編程目前只支持該公司的 GPU。以下幾個系列的 GPU 都支持 CUDA 編程:

? Tesla 系列:其中的內存為糾錯內存(error-correcting code memory,ECC 內存),穩定性好,主要用于高性能、高強度的科學計算。

? Quadro 系列:支持高速 OpenGL 渲染,主要用于專業繪圖設計。

? GeForce 系列:主要用于游戲與娛樂,但也常用于科學計算。GeForce 系列的 GPU 沒有糾錯內存,用于科學計算時具有一定的風險。然而,GeForce 系列的 GPU 價格相對低廉、性價比高,用于學習 CUDA 編程是沒有任何問題的。即使是便攜式計算機中 GeForce 系列的 GPU 也可以用來學習 CUDA 編程。

? Jetson 系列:嵌入式設備中的 GPU。作者對此無使用經驗,本書也不專門討論。

ca9bff28-dd5d-11ee-a297-92fbcf53809c.png

每一款 GPU 都有一個用以表示其“計算能力”(compute capability)的版本號。該版本號可以寫為形如 X.Y 的形式。其中,X 表示主版本號,Y 表示次版本號。版本號決定了 GPU 硬件所支持的功能,可為應用程序在運行時判斷硬件特征提供依據。

初學者往往誤以為 GPU 的計算能力越高,性能就越高,但后面我們會看到,計算能力和性能沒有簡單的正比關系。

ca9ff93e-dd5d-11ee-a297-92fbcf53809c.png

CUDA 程序開發工具

CUDA 編程語言最初主要是基于 C 語言的,但目前越來越多地支持 C++ 語言。還有基于 Fortran 的 CUDA Fortran 版本及由其他編程語言包裝的 CUDA 版本,但本書只涉及基于 C++ 的 CUDA 編程。我們稱基于 C++ 的 CUDA 編程語言為 CUDA C++。

對 Fortran 版本感興趣的讀者可以參考網站 https://www.pgroup.com/。用戶可以免費下載支持 CUDAFortran 編程的 PGI 開發工具套裝的社區版本(Community Edition)。對應的還有收費的專業版本(Professional Edition)。PGI 是高性能計算編譯器公司 Portland Group, Inc. 的簡稱,已被英偉達公司收購。

CUDA 提供了兩層 API(Application Programming Interface,應用程序編程接口)給程序員使用,即 CUDA 驅動(driver)API 和 CUDA 運行時(runtime)API。

其中,CUDA 驅動 API 是更加底層的 API,它為程序員提供了更為靈活的編程接口;

CUDA 運行時 API 是在 CUDA 驅動 API 的基礎上構建的一個更為高級的 API,更容易使用。

這兩種 API 在性能上幾乎沒有差別。從程序的可讀性來看,使用 CUDA 運行時 API 是更好的選擇。在其他編程語言中使用 CUDA 的時候,驅動 API 很多時候是必需的。因為作者沒有使用驅動 API 的經驗,故本書只涉及 CUDA 運行時 API

caa5e7f4-dd5d-11ee-a297-92fbcf53809c.png

圖 1.2 展示了 CUDA 開發環境的主要組件。開發的應用程序是以主機(CPU)為出發點的。

應用程序可以調用 CUDA 運行時 API、CUDA 驅動 API 及一些已有的 CUDA 庫。所有這些調用都將利用設備(GPU)的硬件資源。

對 CUDA 運行時 API 的介紹是本書大部分章節的重點內容;第 14 章將介紹若干常用的 CUDA 庫。

CUDA 版本也由形如 X.Y 的兩個數字表示,但它并不等同于 GPU 的計算能力。

可以這樣理解:CUDA 版本是 GPU 軟件開發平臺的版本,而計算能力對應著 GPU 硬件架構的版本。

CUDA 開發環境搭建示例

我們說過,GPU 計算實際上是 CPU+GPU(主機 + 設備)的異構計算。在 CUDA C++ 程序中,既有運行于主機的代碼,也有運行于設備的代碼。

其中,運行于主機的代碼需要由主機的 C++ 編譯器編譯和鏈接。

所以,除了安裝 CUDA 工具箱,還需要安裝一個主機的 C++ 編譯器。在 Windows 中,最常用的 C++ 編譯器是 Microsoft Visual C++ (MSVC),它目前集成在 Visual Studio 中,所以我們首先安裝 Visual Studio。

作者安裝了最高版本的 Visual Studio 2019 16.x。因為這是個人使用的,故選擇了免費的 Community 版本。下載地址為https://visualstudio.microsoft.com/free-developer-offers/。對于 CUDA C++ 程序開發來說,只需要選擇安裝 Desktop development with C++ 即可。當然,讀者也可以選擇安裝更多的組件。

caa9694c-dd5d-11ee-a297-92fbcf53809c.png

關于 CUDA,作者選擇安裝 2019 年 8 月發布的 CUDA Toolkit 10.1 update2。首先,進入網址 https://developer.nvidia.com/cuda-10.1-download-archive-update2。

然后根據提示,做如下選擇:Operating System 項選擇 Windows;Architecture 項選擇 x86_64;Version 項選擇操作系統版本,我們這里是 10;Installer Type 項可以選擇 exe (network) 或者 exe (local),分別代表一邊下載一邊安裝和下載完畢后安裝。

接著,運行安裝程序,根據提示一步一步安裝即可。該版本的 CUDA 工具箱包含一個對應版本的 Nvidia driver,故不需要再單獨安裝 Nvidia driver。

安裝好 Visual Studio 和 CUDA 后,進入到如下目錄(讀者如果找不到 C 盤下的 ProgramData 目錄,可能是因為沒有選擇顯示一些隱藏的文件):

C:ProgramDataNVIDIA CorporationCUDA Samplesv10.11_UtilitiesdeviceQuery

然后,用 Visual Studio 2019 打開文件 deviceQuery_vs2019.sln。接下來,編譯(構建)、運行。若輸出內容的最后部分為 Result = PASS,則說明已經搭建好 Windows 中的 CUDA 開發環境。若有疑問,請參閱 Nvidia 的官方文檔:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows。

在上面的測試中,我們是直接用 Visual Studio 打開一個已有的解決方案(solution),然后直接構建并運行。本書不介紹 Visual Studio 的使用,而是選擇用命令行解釋器編譯與運行程序。

這里的命令行解釋器指的是 Linux 中的 terminal 或者 Windows 中的 command prompt 程序。

在 Windows 中使用 MSVC 作為 C++ 程序的編譯器時,需要單獨設置相應的環境變量,或者從 Windows 的開始(start)菜單中找到 Visual Studio 2019 文件夾,然后單擊其中的“x64 Native Tools Command Prompt for VS 2019”,而從打開一個加載了 MSVC 環境變量的命令行解釋器。

在本書的某些章節,需要有管理員的權限來使用 nvprof 性能分析器。此時,可以右擊“x64 Native Tools Command Prompt for VS 2019”,然后選擇“更多”,接著選擇“以管理員身份運行”。

用命令行解釋器編譯與運行 CUDA 程序的方式在 Windows 和 Linux 系統幾乎沒有區別,但為了簡潔起見,本書后面主要以 Linux 開發環境為例進行講解。雖然如此,Windows 和 Linux 中的 CUDA 編程功能還是稍有差別。我們將在后續章節中適當的地方指出這些差別。

用 nvidia-smi 檢查與設置設備

caafe574-dd5d-11ee-a297-92fbcf53809c.png

可以通過 nvidia-smi(Nvidia’s system management interface)程序檢查與設置設備。

它包含在 CUDA 開發工具套裝內。該程序最基本的用法就是在命令行解釋器中使用不帶任何參數的命令 nvidia-smi。

在作者的計算機中使用該命令,得到如下文本形式的輸出:

從中可以看出一些比較有用的信息

? 第一行可以看到 Nvidia driver 的版本及 CUDA 工具箱的版本。

? 作者所用計算機中有一型號為 GeForce RTX 2070 的 GPU。該 GPU 的設備號是 0。該計算機僅有一個 GPU。如果有多個 GPU,會將各個 GPU 從 0 開始編號。如果讀者的系統中有多個 GPU,而且只需要使用某個特定的 GPU(比如兩個之中更強大的那個),則可以通過設置環境變量 CUDA_VISIBLE_DEVICES 的值在運行 CUDA 程序之前選定一個 GPU。假如讀者的系統中有編號為 0 和 1 的兩個 GPU,而讀者想在 1 號 GPU 運行 CUDA 程序,則可以用如下命令設置環境變量:

$ export CUDA_VISIBLE_DEVICES=1

這樣設置的環境變量在當前 shell session 及其子進程中有效

? 該 GPU 處于 WDDM(windows display driver model )模式。另一個可能的模式是 TCC(tesla compute cluster),但它僅在 Tesla、Quadro 和 Titan 系列的 GPU 中可選??捎萌缦路绞竭x擇(在 Windows 中需要用管理員身份打開 Command Prompt 并去掉命令中的 sudo):

sudo nvidia-smi -g GPU_ID -dm 1 # 設置為 TCC 模式

這里,GPU_ID 是 GPU 的編號。

? 該 GPU 當前的溫度為 38 攝氏度。GPU 在滿負荷運行時,溫度會高一些。

? 這是 GeForce 系列的 GPU,沒有 ECC 內存,故 Uncorr. ECC 為 N/A,代表不適用(not applicable)或者不存在(not available)。

? Compute M. 指計算模式(compute mode)。該 GPU 的計算模式是 Default。在默認模式中,同一個 GPU 中允許存在多個計算進程,但每個計算進程對應程序的運行速度一般來說會降低。還有一種模式為 E. Process,指的是獨占進程模式(exclusive processmode),但不適用于處于 WDDM 模式的 GPU。在獨占進程模式下,只能運行一個計算進程獨占該 GPU??梢杂萌缦旅钤O置計算模式(在 Windows 中需要用管理員身份打開 Command Prompt 并去掉命令中的 sudo):

sudo nvidia-smi -i GPU_ID -c 1 # 獨占進程模式

這里,-i GPU_ID 的意思是希望該設置僅僅作用于編號為 GPU_ID 的 GPU;如果去掉該選項,該設置將會作用于系統中所有的 GPU。

關于 nvidia-smi 程序更多的介紹,請參考如下官方文檔:https://developer.nvidia.com/nvidia-system-management-interface。

CUDA 的官方手冊

任何關于 CUDA 編程的書籍都不可能替代官方提供的手冊等資料。以下是幾個重要的官方文檔,請讀者在有一定的基礎之后務必查閱。限于作者水平,本書難免存在謬誤。當讀者覺得本書中的個別論斷與官方資料有沖突時,當以官方資料為標準(官方手冊的網址為 https://docs.nvidia.com/cuda)。在這個網站,包括但不限于以下幾個方面的文檔:

? 安裝指南(installation guides)。讀者遇到與 CUDA 安裝有關的問題時,應該仔細閱讀此處的文檔。

? 編程指南(programming guides)。該部分有很多重要的文檔:– 最重要的文檔是《CUDA C++ Programming Guide》,見以下網址:https://docs.nvidia.com/cuda/cuda-c-programming-guide。– 另一個值得一看的文檔是《CUDA C++ Best Practices Guide》,見以下網址:https://docs.nvidia.com/cuda/cuda-c-best-practices-guide。– 針對最近的幾個 GPU 架構進行優化的指南,包括以下網址:

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。

這幾個簡短的文檔可以幫助有經驗的用戶迅速了解一個新的架構。

? CUDA API 手冊(CUDA API references)。這里有:– CUDA 運 行 時 API 的 手 冊:https://docs.nvidia.com/cuda/cuda-runtime-api。– CUDA 驅動 API 的手冊:https://docs.nvidia.com/cuda/cuda-driver-api。– CUDA 數 學 函 數 庫 API 的 手 冊:https://docs.nvidia.com/cuda/cuda-math-api– 其他若干 CUDA 庫的手冊。

為明確起見,在撰寫本書時,作者參考的是與 CUDA 10.2 對應的官方手冊。

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • gpu
    gpu
    +關注

    關注

    27

    文章

    4470

    瀏覽量

    127061
  • C語言
    +關注

    關注

    180

    文章

    7542

    瀏覽量

    131045
  • 編程語言
    +關注

    關注

    9

    文章

    1881

    瀏覽量

    33549
  • C++
    C++
    +關注

    關注

    21

    文章

    2067

    瀏覽量

    72961
  • CUDA
    +關注

    關注

    0

    文章

    119

    瀏覽量

    13483

原文標題:一文講清楚GPU 硬件與 CUDA 程序開發工具

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在K520上能使用兩個GPU進行CUDA作業嗎

    如果沒有其他用戶共享K520,您是否可以抓取兩個GPU進行CUDA計算作業?我們的應用程序使用GPU進行顯示和計算。當我們在AWS K520實例上運行時,CUDA只能看到K520上的
    發表于 09-26 15:23

    英飛凌MCU開發工具軟件安裝詳解

    電路設計:電子工程師【心頭好】—英飛凌MCU硬件電路設計收藏http://www.infineonic.org/bbs/article_1166_376111.html英飛凌MCU開發工具軟件安裝詳解.pdf (3.21 MB
    發表于 12-14 09:38

    款用于通信硬件開發工具

    款用于通信硬件開發工具
    發表于 10-22 10:19

    嵌入式軟件開發工具

    翻譯自這篇博不同物理設備之間的數字轉換可以說是隨處可見,讓其智能又強大。驅動設備的引擎是嵌入式軟件,它是快速發展的IoT生態系統中不可或缺的部分。本篇博客主要談嵌入式軟件開發工具。解釋
    發表于 10-28 08:21

    GPU高性能運算之CUDA

      全面介紹使用CUDA進行通用計算所需   要的語法、硬件架構、程序優化技巧等知識,是進行GPU通用計算程序開發的入門教材和參考書。   本書共分5章。第1章
    發表于 08-16 16:21 ?0次下載

    STM32 VR開發工具

    STM32 VR開發工具
    發表于 02-17 13:38 ?39次下載

    全志VR開發工具

    全志VR開發工具
    發表于 02-17 14:08 ?31次下載

    ARM開發工具解讀

    1.6 ARM開發工具 用戶選用ARM處理器開發嵌入式產品時,選擇合適的開發工具可以加快開發進度,節省開發成本。根據功能不同,ARM應用軟件
    發表于 10-18 13:29 ?3次下載
    ARM<b class='flag-5'>開發工具</b>解讀

    MSP430第三章硬件開發工具

    本章的目的是描述MSP430硬件開發工具。在接下來的章節中,實驗室將由兩個平臺中的任一個來支持。
    發表于 05-04 16:07 ?5次下載
    MSP430第三章<b class='flag-5'>硬件</b><b class='flag-5'>開發工具</b>

    如何使用KEELOQ3開發工具包作為開發工具來在目標板上仿真和調試固件

    本文檔介紹了如何使用 KEELOQ? 3 開發工具包作為開發工具來在目標板上仿真和調試固件。
    發表于 06-13 08:30 ?36次下載
    如何使用KEELOQ3<b class='flag-5'>開發工具</b>包作為<b class='flag-5'>開發工具</b>來在目標板上仿真和調試固件

    6個高效的前端開發工具

    高效的前端開發工具有哪些?在互聯網中許多開發工具可以讓前端開發人員的工作生活變得更加輕松。應用程序的功能越來越豐富,也導致了前端開發的復雜度大幅增加,急需好的
    的頭像 發表于 01-05 16:00 ?4104次閱讀

    硬件開發工具介紹

    MaskROM IC 制作了相關的硬件開發工具,包括 FDB 演示板、OTP 和相關燒錄器、Romter、ICE 等不 同的硬件工具,結合相關的軟件
    發表于 06-14 15:14 ?4次下載
    <b class='flag-5'>硬件</b><b class='flag-5'>開發工具</b>介紹

    NVIDIA CUDA工具包的概念及主要功能

    NVIDIA CUDA 工具包提供了開發環境,可供開發、優化和部署經 GPU 加速的高性能應用。
    的頭像 發表于 06-10 12:03 ?3107次閱讀

    嵌入式硬件的軟件開發工具趨勢

    嵌入式硬件的軟件開發工具趨勢
    的頭像 發表于 12-28 09:51 ?825次閱讀

    開發板和開發工具指南

    與使用開發環境相比,許多工程師更傾向于將調試點嵌入其代碼并使用測試設備來驗證其硬件。歐時電子指南將詳述開發板和開發工具的優勢,并提供關于使用和選擇恰當
    的頭像 發表于 10-26 14:35 ?313次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>