計(jì)算機(jī)架構(gòu)分類 Flynn于1972年提出了計(jì)算平臺(tái)的Flynn分類法,,主要根據(jù)指令流和數(shù)據(jù)流來(lái)分類,,共分為四種類型的計(jì)算平臺(tái),如下圖所示: [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-NNTYad5j-1在這里插入圖片描述652234310996)(https://raw./WongHuLin/picture/main/202205101530381.png)]
CPU架構(gòu)和GPU架構(gòu)通用的cpu是SISD架構(gòu)的,,而GPU架構(gòu)是SIMD的。 比如,有以下指令: 但有了SIMD技術(shù),只需一條指令即可處理完: SIMT(Single Instruction Multiple Threads,,單指令多線程)是SIMD的升級(jí)版,,可對(duì)GPU中單個(gè)SM中的多個(gè)Core同時(shí)處理同一指令,并且每個(gè)Core存取的數(shù)據(jù)可以是不同的,。 上述指令會(huì)被同時(shí)送入在單個(gè)SM中被編組的所有Core中,,同時(shí)執(zhí)行運(yùn)算,但 二、GPU架構(gòu)分析GPU架構(gòu)是圍繞一個(gè)流式多處理器(SM)的擴(kuò)展陣列搭建的,。通過(guò)復(fù)制這種結(jié)構(gòu)來(lái)實(shí)現(xiàn)GPU的硬件并行,。 上圖包括關(guān)鍵組件:
Fermi 架構(gòu)Fermi架構(gòu)是第一個(gè)完整的GPU架構(gòu),所以了解這個(gè)架構(gòu)是非常有必要的,。 Fermi架構(gòu)邏輯圖如上,,具體數(shù)據(jù)如下:
而SM則包括下面這些資源:
特殊功能單元SFU執(zhí)行固有指令,如正弦,,余弦,平方根和插值,,SFU在每個(gè)時(shí)鐘周期內(nèi)的每個(gè)線程上執(zhí)行一個(gè)固有指令,。 每個(gè)SM有兩個(gè)線程束調(diào)度器,和兩個(gè)指令調(diào)度單元,,當(dāng)一個(gè)線程塊被指定給一個(gè)SM時(shí),,線程塊內(nèi)的所有線程被分成線程束,兩個(gè)線程束選擇其中兩個(gè)線程束,,在用指令調(diào)度器存儲(chǔ)兩個(gè)線程束要執(zhí)行的指令 三,、GPU編程模型 異構(gòu)架構(gòu)GPU作為外設(shè)一般插在主板的PCIe卡口上,運(yùn)行程序的時(shí)候,,CPU像是一個(gè)控制者,,指揮兩臺(tái)Titan完成工作后進(jìn)行匯總,,和下一步工作安排,所以CPU我們可以把它看做一個(gè)指揮者,,主機(jī)端,,host,而完成大量計(jì)算的GPU是我們的計(jì)算設(shè)備,,device,。
一個(gè)異構(gòu)應(yīng)用包含兩種以上架構(gòu),所以代碼也包括不止一部分:
主機(jī)代碼在主機(jī)端運(yùn)行,,被編譯成主機(jī)架構(gòu)的機(jī)器碼,,設(shè)備端的在設(shè)備上執(zhí)行,被編譯成設(shè)備架構(gòu)的機(jī)器碼,,所以主機(jī)端的機(jī)器碼和設(shè)備端的機(jī)器碼是隔離的,,自己執(zhí)行自己的,沒(méi)辦法交換執(zhí)行,。 主機(jī)端代碼主要是控制設(shè)備,完成數(shù)據(jù)傳輸?shù)瓤刂祁惞ぷ?,設(shè)備端主要的任務(wù)就是計(jì)算。 四、GPU基本概念 硬件層面:
軟件層面:
五、GPU編程模型在CUDA代碼中,,用 一個(gè)核函數(shù)只能有一個(gè)grid,一個(gè)grid可以有很多個(gè)塊,,每個(gè)塊可以有很多的線程,,這種分層的組織結(jié)構(gòu)使得我們的并行過(guò)程更加自如靈活,。 一個(gè)線程塊block中的線程可以完成下述協(xié)作:
不同塊內(nèi)線程不能相互影響,!他們是物理隔離的,! 接下來(lái)就是給每個(gè)線程一個(gè)編號(hào)了,,我們知道每個(gè)線程都執(zhí)行同樣的一段串行代碼,,那么怎么讓這段相同的代碼對(duì)應(yīng)不同的數(shù)據(jù)呢?首先第一步就是讓這些線程彼此區(qū)分開(kāi),,才能對(duì)應(yīng)到相應(yīng)從線程,,使得這些線程也能區(qū)分自己的數(shù)據(jù)。如果線程本身沒(méi)有任何標(biāo)記,那么沒(méi)辦法確認(rèn)其行為。依靠下面兩個(gè)內(nèi)置結(jié)構(gòu)體確定線程標(biāo)號(hào):
網(wǎng)格和塊的維度一般是二維和三維的,,也就是說(shuō)一個(gè)網(wǎng)格通常被分成二維的塊,,而每個(gè)塊常被分成三維的線程,。 CUDA編程模型從邏輯角度和硬件角度的對(duì)應(yīng)關(guān)系: 一個(gè)線程在一個(gè)CUDA Core執(zhí)行,一個(gè)線程塊被分配到一個(gè)SM上面執(zhí)行,,一個(gè)Grid在GPU設(shè)備執(zhí)行,。 線程束 上述我們知道了,CUDA代碼在執(zhí)行的時(shí)候會(huì)被劃分成很多個(gè)塊,,然后不同的塊可以被調(diào)度到不同的SM上面執(zhí)行。而在GPU物理單元的調(diào)度最小單元是線程束,。線程束是SM中基本的執(zhí)行單元,,線程塊會(huì)被分配到某個(gè)SM上,并劃分成多個(gè)線程束,,每個(gè)線程束一般是32個(gè)線程,,同一個(gè)線程束中的線程執(zhí)行相同的指令。 即線程塊中的線程會(huì)以32個(gè)線程劃分成不同的線程束,,然后每一個(gè)SM上會(huì)有線程束調(diào)度器,將SM上的線程束調(diào)度到執(zhí)行單元上執(zhí)行,。 SM上線程束的調(diào)度: 線程束和線程塊的區(qū)別 線程塊Block
線程束Warp
六、GPU內(nèi)存模型典型的內(nèi)存層次結(jié)構(gòu)圖如下所示,從上到下分別是寄存器,、緩存、主存和磁盤(pán),,從上往下訪問(wèn)速度是越來(lái)越慢但存儲(chǔ)空間是越來(lái)越大,。 CUDA內(nèi)存模型相對(duì)于CPU來(lái)說(shuō)那是相當(dāng)豐富了,,GPU上的內(nèi)存設(shè)備有:
上述各種都有自己的作用域,生命周期和緩存行為,。CUDA中每個(gè)線程都有自己的私有的本地內(nèi)存,;線程塊有自己的共享內(nèi)存,對(duì)線程塊內(nèi)所有線程可見(jiàn),;所有線程都能訪問(wèn)讀取常量?jī)?nèi)存和紋理內(nèi)存,,但是不能寫(xiě),,因?yàn)樗麄兪侵蛔x的;全局內(nèi)存,,常量?jī)?nèi)存和紋理內(nèi)存空間有不同的用途,。對(duì)于一個(gè)應(yīng)用來(lái)說(shuō),全局內(nèi)存,,常量?jī)?nèi)存和紋理內(nèi)存有相同的生命周期,。 寄存器 寄存器無(wú)論是在CPU還是在GPU都是速度最快的內(nèi)存空間,但是和CPU不同的是GPU的寄存器儲(chǔ)量要多一些,,而且當(dāng)我們?cè)诤撕瘮?shù)內(nèi)不加修飾的聲明一個(gè)變量,,此變量就存儲(chǔ)在寄存器中,但是CPU運(yùn)行的程序有些不同,,只有當(dāng)前在計(jì)算的變量存儲(chǔ)在寄存器中,,其余在主存中,使用時(shí)傳輸至寄存器,。在核函數(shù)中定義的有常數(shù)長(zhǎng)度的數(shù)組也是在寄存器中分配地址的,。 寄存器對(duì)于每個(gè)線程是私有的,寄存器通常保存被頻繁使用的私有變量,,注意這里的變量也一定不能使共有的,,不然的話彼此之間不可見(jiàn),就會(huì)導(dǎo)致大家同時(shí)改變一個(gè)變量而互相不知道,,寄存器變量的聲明周期和核函數(shù)一致,,從開(kāi)始運(yùn)行到運(yùn)行結(jié)束,執(zhí)行完畢后,,寄存器就不能訪問(wèn)了,。 寄存器是SM中的稀缺資源,,F(xiàn)ermi架構(gòu)中每個(gè)線程最多63個(gè)寄存器。Kepler結(jié)構(gòu)擴(kuò)展到255個(gè)寄存器,,一個(gè)線程如果使用更少的寄存器,,那么就會(huì)有更多的常駐線程塊,SM上并發(fā)的線程塊越多,,效率越高,,性能和使用率也就越高。 那么問(wèn)題就來(lái)了,,如果一個(gè)線程里面的變量太多,,以至于寄存器完全不夠呢?這時(shí)候寄存器發(fā)生溢出,,本地內(nèi)存就會(huì)過(guò)來(lái)幫忙存儲(chǔ)多出來(lái)的變量,,這種情況會(huì)對(duì)效率產(chǎn)生非常負(fù)面的影響,所以,,不到萬(wàn)不得已,,一定要避免此種情況發(fā)生。 本地內(nèi)存 核函數(shù)中符合存儲(chǔ)在寄存器中但不能進(jìn)入被核函數(shù)分配的寄存器空間中的變量將存儲(chǔ)在本地內(nèi)存中,,編譯器可能存放在本地內(nèi)存中的變量有以下幾種:
本地內(nèi)存實(shí)質(zhì)上是和全局內(nèi)存一樣在同一塊存儲(chǔ)區(qū)域當(dāng)中的,,其訪問(wèn)特點(diǎn)——高延遲,低帶寬,。對(duì)于2.0以上的設(shè)備,,本地內(nèi)存存儲(chǔ)在每個(gè)SM的一級(jí)緩存,或者設(shè)備的二級(jí)緩存上,。 共享內(nèi)存 在核函數(shù)中使用_ _share_ _修飾符的內(nèi)存,,稱為共享內(nèi)存。每個(gè)SM都有一定數(shù)量的由線程塊分配的共享內(nèi)存,,共享內(nèi)存是片上內(nèi)存,,跟主存相比,速度要快很多,,也即是延遲低,,帶寬高。其類似于一級(jí)緩存,,但是可以被編程。 使用共享內(nèi)存的時(shí)候一定要注意,,不要因?yàn)檫^(guò)度使用共享內(nèi)存,,而導(dǎo)致SM上活躍的線程束減少,也就是說(shuō),,一個(gè)線程塊使用的共享內(nèi)存過(guò)多,,導(dǎo)致更過(guò)的線程塊沒(méi)辦法被SM啟動(dòng),,這樣影響活躍的線程束數(shù)量。 共享內(nèi)存在核函數(shù)內(nèi)聲明,,生命周期和線程塊一致,,線程塊運(yùn)行開(kāi)始,此塊的共享內(nèi)存被分配,,當(dāng)此塊結(jié)束,,則共享內(nèi)存被釋放。 共享內(nèi)存是線程塊內(nèi)線程可見(jiàn)的,,可以通過(guò)**_syncthreads()**同步語(yǔ)句來(lái)避免內(nèi)存競(jìng)爭(zhēng)問(wèn)題 共享內(nèi)存和SM中的一級(jí)緩存都使用64KB的片上內(nèi)存,,并且可以靜態(tài)劃分彼此的容量。 常量?jī)?nèi)存 常量?jī)?nèi)存駐留在設(shè)備內(nèi)存中,,每個(gè)SM都有專用的常量?jī)?nèi)存緩存,,常量?jī)?nèi)存使用**constant**來(lái)修飾。 常量?jī)?nèi)存存在于核函數(shù)之外,,在kernel函數(shù)外聲明,,即常量?jī)?nèi)存存在于內(nèi)存中,并不在片上,,常量?jī)?nèi)容的訪問(wèn)速度也是很快的,,這是因?yàn)槊總€(gè)SM都有專用的常量?jī)?nèi)存緩存,會(huì)把片外的常量讀取到緩存中,;對(duì)所有的核函數(shù)都可見(jiàn),,在Host端進(jìn)行初始化后,核函數(shù)不能再修改,。 常量?jī)?nèi)存并不是在片上的,,而是在DRAM上,而其有在片上對(duì)應(yīng)的緩存,,其片上緩存就和一級(jí)緩存和共享內(nèi)存一樣,, 有較低的延遲,但是容量比較小,。 紋理內(nèi)存 紋理內(nèi)存駐留在設(shè)備內(nèi)存中,,在每個(gè)SM的只讀緩存中緩存,紋理內(nèi)存是通過(guò)指定的緩存訪問(wèn)的全局內(nèi)存,。 從數(shù)學(xué)的角度,,上圖中的4個(gè)地址并非連續(xù)的,在一般的CPU緩存中,,這些地址將不會(huì)緩存,。但由于GPU紋理緩存是專門(mén)為了加速這種訪問(wèn)模式而設(shè)計(jì)的,因此如果在這種情況中使用紋理內(nèi)存而不是全局內(nèi)存,,那么將會(huì)獲得性能的提升,。 全局內(nèi)存 位于片外存儲(chǔ)體中,。容量大、訪問(wèn)延遲高,、傳輸速度較慢,。所有數(shù)據(jù)都必須先傳入到這里,或者從這里傳出,。 一般在主機(jī)端代碼里定義,,也可以在設(shè)備端定義,不過(guò)需要加修飾符,,只要不銷毀,,是和應(yīng)用程序同生命周期的。 在CUDA中用修飾符 device 聲明變量: 緩存 與CPU緩存類似,,GPU緩存不可編程,,其行為出廠是時(shí)已經(jīng)設(shè)定好了。GPU上有4種緩存:
每個(gè)SM都有一個(gè)一級(jí)緩存,,所有SM公用一個(gè)二級(jí)緩存,。一級(jí)二級(jí)緩存的作用都是被用來(lái)存儲(chǔ)本地內(nèi)存和全局內(nèi)存中的數(shù)據(jù),也包括寄存器溢出的部分,。 每個(gè)SM有一個(gè)只讀常量緩存,,只讀紋理緩存,它們用于設(shè)備內(nèi)存中提高來(lái)自于各自內(nèi)存空間內(nèi)的讀取性能,。 https://blog.csdn.net/weixin_51971301/article/details/124703677 |
|
來(lái)自: 新用戶0118F7lQ > 《文件夾1》