目錄
1、CUDA的簡介
2、GPU架構和CUDA介紹
3、CUDA架構
4、開發(fā)環(huán)境說明和配置
5、開始第一個Hello CUDA程序
5.1、VS2017創(chuàng)建NVIDIA CUDA項目
5.2、VS2017中輸入 CUDA代碼(附.cu代碼以及講解)
5.3、VS2017生成并開始執(zhí)行
參考
1、CUDA的簡介
計算統(tǒng)一設備架構(Compute Unified Device Architecture,CUDA)是由英偉達(NVIDIA)開發(fā)的一套非常流行的并行計算平臺和編程模型。它只支持NVIDIA GPU卡。OpenCL則用來為其他類型的GPU編寫并行代碼,比如AMD和英特爾,但它比CUDA更復雜。CUDA可以使用簡單的編程API在圖形處理單元(GPU)上創(chuàng)建大規(guī)模并行應用程序。
使用C和C++的軟件開發(fā)人員可以通過使用CUDA C或C++來利用GPU的強大性能來加速他們的軟件應用程序。用CUDA編寫的程序類似于用簡單的C或C++編寫的程序,添加需要利用GPU并行性的關鍵字。CUDA允許程序員指定CUDA代碼的哪個部分在CPU上執(zhí)行,哪個部分在GPU上執(zhí)行。
2、GPU架構和CUDA介紹
GeForce 256是英偉達于1999年開發(fā)的第一個GPU。最初只用在顯示器上渲染高端圖形。它們只用于像素計算。后來,人們意識到如果可以做像素計算,那么他們也可以做其他的數(shù)學計算?,F(xiàn)在,GPU除了用于渲染圖形圖像外,還用于其他許多應用程序中。這些GPU被稱為通用GPU(GPGPU)。
CPU具有復雜的控制硬件和較少的數(shù)據(jù)計算硬件。復雜的控制硬件在性能上提供了CPU的靈活性和一個簡單的編程接口,但是就功耗而言,這是昂貴的。而另一方面,GPU具有簡單的控制硬件和更多的數(shù)據(jù)計算硬件,使其具有并行計算的能力。這種結構使它更節(jié)能。缺點是它有一個更嚴格的編程模型。在GPU計算的早期,OpenGL和DirectX等圖形API是與GPU交互的唯一方式。對于不熟悉OpenGL或DirectX的普通程序員來說,這是一項復雜的任務。這促成了CUDA編程架構的開發(fā),它提供了一種與GPU交互的簡單而高效的方式。
一般來說,任何硬件架構的性能都是根據(jù)延遲和吞吐量來度量的。延遲是完成給定任務所花費的時間,而吞吐量是在給定時間內完成任務的數(shù)量。這些概念并不矛盾。通常情況下,提高一個,另一個也會隨之提高。在某種程度上,大多數(shù)硬件架構旨在提高延遲或吞吐量。
同樣,正常的串行CPU被設計為優(yōu)化延遲,而GPU被設計為優(yōu)化吞吐量。CPU被設計為在最短時間內執(zhí)行所有指令,而GPU被設計為在給定時間內執(zhí)行更多指令。GPU的這種設計理念使它們在圖像處理和計算機視覺應用中非常有用,這也是本書的目的,因為我們不介意單個像素處理的延遲。我們想要的是在給定的時間內處理更多的像素,這可以在GPU上完成。
綜上所述,如果我們想在相同的時鐘速度和功率要求下提高計算性能,那么并行計算就是我們所需要的。GPU通過讓許多簡單的計算單元并行工作來提供這種能力?,F(xiàn)在,為了與GPU交互,并利用其并行計算能力,我們需要一個由CUDA提供的簡單的并行編程架構。
3、CUDA架構
CUDA架構包括幾個專門為GPU通用計算而設計的特性,這在早期的架構中是不存在的。它包括一個unified shedder管道,它允許GPU芯片上的所有算術邏輯單元(ALU)被一個CUDA程序編組。ALU還被設計成符合IEEE浮點單精度和雙精度標準,因此它可以用于通用應用程序。指令集也適合于一般用途的計算,而不是特定于像素計算。它還允許對內存的任意讀寫訪問。這些特性使CUDA GPU架構在通用應用程序中非常有用。
所有的GPU都有許多被稱為核心(Core)的并行處理單元。
在硬件方面,這些核心被分為流處理器和流多處理器。GPU有這些流多處理器的網格。
在軟件方面,CUDA程序是作為一系列并行運行的多線程(Thread)來執(zhí)行的。每個線程都在不同的核心上執(zhí)行??梢詫PU看作多個塊(Block)的組合,每個塊可以執(zhí)行多個線程。每個塊綁定到GPU上的不同流多處理器。
CUDA程序員不知道如何在塊和流多處理器之間進行映射,但是調度器知道并完成映射。來自同一塊的線程可以相互通信。GPU有一個分層的內存結構,處理一個塊和多個塊內線程之間的通信。這將在接下來的章節(jié)中詳細討論。
作為一名程序員,你會好奇CUDA中的編程模型是什么,以及代碼將如何理解它是應該在CPU上執(zhí)行還是在GPU上執(zhí)行。我們將CPU及其內存稱為主機(Host),GPU及其內存稱為設備(Device)。CUDA代碼包含主機和設備的代碼。主機代碼由普通的C或C++編譯器在CPU上編譯,設備代碼由GPU編譯器在GPU上編譯。主機代碼通過所謂的內核調用調用設備代碼。它將在設備上并行啟動多個線程。在設備上啟動多少線程是由程序員來決定的。
現(xiàn)在,你可能會問這個設備代碼與普通C代碼有何不同。答案是,它類似于正常的串行C代碼。只是這段代碼是在大量內核上并行執(zhí)行的。然而,要使這段代碼工作,它需要設備顯存上的數(shù)據(jù)。因此,在啟動線程之前,主機將數(shù)據(jù)從主機內存復制到設備顯存。線程處理來自設備顯存的數(shù)據(jù),并將結果存儲在設備顯存中。最后,將這些數(shù)據(jù)復制回主機內存進行進一步處理。綜上所述,CUDA C程序的開發(fā)步驟如下:
1)為主機和設備顯存中的數(shù)據(jù)分配內存。
2)將數(shù)據(jù)從主機內存復制到設備顯存。
3)通過指定并行度來啟動內核。
4)所有線程完成后,將數(shù)據(jù)從設備顯存復制回主機內存。
5)釋放主機和設備上使用的所有內存。
4、開發(fā)環(huán)境說明和配置
先決條件:
1、電腦具有支持cuda的GPU(一般具有獨立顯卡就可以,不過最好不要太老的版本);
2、英偉達顯卡驅動;
3、標準C編譯器;
4、CUDA開發(fā)工具包。
windows10下cuda工具包的安裝:
1、MicroSoft Visio Studio 2017的安裝(也可以是其他的版本,筆者使用的是2017)
2、下載cuda10.1安裝包(最新的是10.2);
3、直接點擊.exe文件進行安裝,選擇自定義安裝,所有選項均勾選;
4、配置CUDA系統(tǒng)環(huán)境變量(和配置深度學習環(huán)境一樣配置系統(tǒng)環(huán)境變量)。
5、開始第一個Hello CUDA程序
5.1、VS2017創(chuàng)建NVIDIA CUDA項目
步驟如下:
1)打開Microsoft Visual Studio。
2)進入File|New|Project。
3)依次選擇NVIDIA|CUDA 10.1|CUDA 10.1 Runtime。
4)為項目自定義名稱,然后單擊OK按鈕。
5)它將創(chuàng)建一個帶有kernel.cu示例文件的項目?,F(xiàn)在雙擊打開這個文件。
6)從文件中刪除現(xiàn)有代碼,寫入前面編寫的那段代碼。
7)從生成(Build)選項卡中選擇生成(build)進行編譯,并按快捷鍵Ctrl+F5調試代碼。
5.2、VS2017中輸入 CUDA代碼
#include
與C編程的區(qū)別:
1)一個名為myfirstkernel的空函數(shù),前綴為/_/_global/_/_
2)使用<<1,1>>>調用myfirstkernel函數(shù)
/_/_global/_/_是CUDA C在標準C中添加的一個限定符,它告訴編譯器在這個限定符后面的函數(shù)定義應該在設備上而不是在主機上運行。在前面的代碼中,myfirstkernel將運行在設備上而不是主機上,但是,在這段代碼中,它是空的。
那么,main函數(shù)將在哪里運行?NVCC編譯器將把這個函數(shù)提供給C編譯器,因為它沒有被global關鍵字修飾,因此main函數(shù)將在主機上運行。
代碼中的第二個不同之處在于對空的myfirstkernel函數(shù)的調用帶有一些尖括號和數(shù)值。這是一個CUDA C技巧:從主機代碼調用設備代碼。它被稱為內核調用。內核調用的細節(jié)將在后面的章節(jié)中解釋。尖括號內的值表示我們希望在運行時從主機傳遞給設備的參數(shù)。基本上,它表示塊的數(shù)量和將在設備上并行運行的線程數(shù)。因此,在這段代碼中,<<<1,1>>>表示myfirstkernel將運行在設備上的一個塊和一個線程或塊上。雖然這不是對設備資源的最佳使用,但是理解在主機上執(zhí)行的代碼和在設備上執(zhí)行的代碼之間的區(qū)別是一個很好的起點。
讓我們再來重溫和修改“Hello,CUDA!”代碼,myfirstkernel函數(shù)將運行在一個只有一個塊和一個線程或塊的設備上。它將通過一個稱為內核啟動的方法從main函數(shù)內部的主機代碼啟動。
5.3、VS2017生成并開始執(zhí)行
審核編輯 黃昊宇
-
gpu
+關注
關注
28文章
4673瀏覽量
128594 -
人工智能
+關注
關注
1790文章
46670瀏覽量
237111 -
CUDA
+關注
關注
0文章
121瀏覽量
13585
發(fā)布評論請先 登錄
相關推薦
評論