久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

GPU設(shè)計(jì)原理

 新用戶0118F7lQ 2023-07-11 發(fā)布于山東

計(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)]

  • 單指令流單數(shù)據(jù)流機(jī)器(SISD)

    SISD機(jī)器是一種傳統(tǒng)的串行計(jì)算機(jī),,它的硬件不支持任何形式的并行計(jì)算,,所有的指令都是串行執(zhí)行。并且在某個(gè)時(shí)鐘周期內(nèi),,CPU只能處理一個(gè)數(shù)據(jù)流,。因此這種機(jī)器被稱作單指令流單數(shù)據(jù)流機(jī)器。早期的計(jì)算機(jī)都是SISD機(jī)器,,如馮諾.依曼架構(gòu),,如IBM PC機(jī),早期的巨型機(jī)和許多8位的家用機(jī)等,。

  • 單指令流多數(shù)據(jù)流機(jī)器(SIMD)

    SIMD是采用一個(gè)指令流處理多個(gè)數(shù)據(jù)流,。這類機(jī)器在數(shù)字信號(hào)處理、圖像處理,、以及多媒體信息處理等領(lǐng)域非常有效,。GPU就是這樣的架構(gòu)。

  • 多指令流單數(shù)據(jù)流機(jī)器(MISD)

    MISD是采用多個(gè)指令流來(lái)處理單個(gè)數(shù)據(jù)流,。由于實(shí)際情況中,,采用多指令流處理多數(shù)據(jù)流才是更有效的方法,因此MISD只是作為理論模型出現(xiàn),,沒(méi)有投入到實(shí)際應(yīng)用之中。

  • 多指令流多數(shù)據(jù)流機(jī)器(MIMD)

    MIMD機(jī)器可以同時(shí)執(zhí)行多個(gè)指令流,,這些指令流分別對(duì)不同數(shù)據(jù)流進(jìn)行操作,。最新的多核計(jì)算平臺(tái)就屬于MIMD的范疇,例如Intel和AMD的雙核處理器等都屬于MIMD,。

CPU架構(gòu)和GPU架構(gòu)

通用的cpu是SISD架構(gòu)的,,而GPU架構(gòu)是SIMD的。圖片

比如,有以下指令:

圖片

對(duì)于沒(méi)有SIMD的處理單元,,需要4條指令將4個(gè)float數(shù)值相加,,匯編偽代碼如下:

圖片

但有了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)算,但a,、b ,、c的值可以不一樣:

圖片

二、GPU架構(gòu)分析

GPU架構(gòu)是圍繞一個(gè)流式多處理器(SM)的擴(kuò)展陣列搭建的,。通過(guò)復(fù)制這種結(jié)構(gòu)來(lái)實(shí)現(xiàn)GPU的硬件并行,。

圖片

上圖包括關(guān)鍵組件:

  • CUDA核心

  • 共享內(nèi)存/一級(jí)緩存

  • 寄存器文件

  • 加載/存儲(chǔ)單元

  • 特殊功能單元

  • 線程束調(diào)度器

Fermi 架構(gòu)

Fermi架構(gòu)是第一個(gè)完整的GPU架構(gòu),所以了解這個(gè)架構(gòu)是非常有必要的,。圖片

Fermi架構(gòu)邏輯圖如上,,具體數(shù)據(jù)如下:

  1. 512個(gè)加速核心,CUDA核

  2. 每個(gè)CUDA核心都有一個(gè)全流水線的整數(shù)算數(shù)邏輯單元ALU,,和一個(gè)浮點(diǎn)數(shù)運(yùn)算單元FPUCUDA核被組織到16個(gè)SM上

  3. 6個(gè)384-bits的GDDR5 的內(nèi)存接口

  4. 支持6G的全局機(jī)栽內(nèi)存

  5. GigaThread疫情,,分配線程塊到SM線程束調(diào)度器上

  6. 768KB的二級(jí)緩存,被所有SM共享

而SM則包括下面這些資源:

  • 執(zhí)行單元(CUDA核)

  • 調(diào)度線程束的調(diào)度器和調(diào)度單元

  • 共享內(nèi)存,,寄存器文件和一級(jí)緩存

  • 每個(gè)多處理器SM有16個(gè)加載/存儲(chǔ)單元所以每個(gè)時(shí)鐘周期內(nèi)有16個(gè)線程(半個(gè)線程束)計(jì)算源地址和目的地址

特殊功能單元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,。

圖片

上面這張圖能大致反應(yīng)CPU和GPU的架構(gòu)不同。
  • 左圖:一個(gè)四核CPU一般有四個(gè)ALU,,ALU是完成邏輯計(jì)算的核心,,也是我們平時(shí)說(shuō)四核八核的核,控制單元,,緩存也在片上,,DRAM是內(nèi)存,一般不在片上,,CPU通過(guò)總線訪問(wèn)內(nèi)存,。

  • 右圖:GPU,綠色小方塊是ALU,,我們注意紅色框內(nèi)的部分SM,,這一組ALU公用一個(gè)Control單元和Cache,這個(gè)部分相當(dāng)于一個(gè)完整的多核CPU,,但是不同的是ALU多了,,control部分變小,,可見(jiàn)計(jì)算能力提升了,控制能力減弱了,,所以對(duì)于控制(邏輯)復(fù)雜的程序,,一個(gè)GPU的SM是沒(méi)辦法和CPU比較的,,但是對(duì)了邏輯簡(jiǎn)單,,數(shù)據(jù)量大的任務(wù),GPU更高效,,一個(gè)GPU有好多個(gè)SM,,而且越來(lái)越多。CPU和GPU之間通過(guò)PCIe總線連接,,用于傳遞指令和數(shù)據(jù),。

一個(gè)異構(gòu)應(yīng)用包含兩種以上架構(gòu),所以代碼也包括不止一部分:

  • 主機(jī)代碼

  • 設(shè)備代碼

主機(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基本概念

硬件層面:

  • SP(Streaming Processor):流處理器,, 是GPU最基本的處理單元,在fermi架構(gòu)開(kāi)始被叫做CUDA core,。

  • SM(Streaming MultiProcessor): GPU中最小的執(zhí)行單元,。一個(gè)SM由多個(gè)CUDA core組成,。

軟件層面:

  • Kernel:在GPU上執(zhí)行的函數(shù),。

  • thread:一個(gè)CUDA的并行程序會(huì)被以許多個(gè)threads來(lái)執(zhí)行,。

  • Block:數(shù)個(gè)threads會(huì)被群組成一個(gè)block,同一個(gè)block中的threads可以同步,,也可以通過(guò)shared memory通信,。

  • Grid:Kernel 所對(duì)應(yīng)的線程集合,,由多個(gè)Block組成,。

  • Warp:是最基本的執(zhí)行單元,一個(gè)warp包含32個(gè)并行thread,,這些thread以不同數(shù)據(jù)資源執(zhí)行相同的指令。

五、GPU編程模型

圖片

在CUDA代碼中,,用__global__修飾的是核函數(shù)(Kernel),,即在GPU設(shè)備中執(zhí)行的代碼,。

圖片

一個(gè)核函數(shù)只能有一個(gè)grid,一個(gè)grid可以有很多個(gè)塊,,每個(gè)塊可以有很多的線程,,這種分層的組織結(jié)構(gòu)使得我們的并行過(guò)程更加自如靈活,。

一個(gè)線程塊block中的線程可以完成下述協(xié)作:

  • 同步

  • 共享內(nèi)存

不同塊內(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):

  • blockIdx(線程塊在線程網(wǎng)格內(nèi)的位置索引)

  • threadIdx(線程在線程塊內(nèi)的位置索引)

網(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

  • 線程塊是一個(gè)邏輯產(chǎn)物,寫(xiě)程序時(shí)是用二維三維的方式進(jìn)行,,所以線程劃分成多維。

  • 在塊中,,每個(gè)線程有唯一編號(hào)(一維二維三維都有)

  • 在網(wǎng)格中,,每個(gè)線程塊也有唯一的編號(hào)(一維二維三維都有)

線程束Warp

  • 線程束是SM中的基本執(zhí)行單元,是一個(gè)物理定義的產(chǎn)物,,每一個(gè)線程束按照SIMT執(zhí)行,。

  • 當(dāng)線程塊分配到一個(gè)SM上以后,以32為單位劃分為多個(gè)線程束,,向上取整。

  • 線程束是通過(guò)線性地址來(lái)劃分線程塊的,。

六、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è)備有:

  • 寄存器

  • 共享內(nèi)存

  • 本地內(nèi)存

  • 常量?jī)?nèi)存

  • 紋理內(nèi)存

  • 全局內(nèi)存

上述各種都有自己的作用域,生命周期和緩存行為,。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)存中的變量有以下幾種:

  • 使用未知索引引用的本地?cái)?shù)組

  • 可能會(huì)占用大量寄存器空間的較大本地?cái)?shù)組或者結(jié)構(gòu)體

  • 任何不滿足核函數(shù)寄存器限定條件的變量

本地內(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種緩存:

  • 一級(jí)緩存

  • 二級(jí)緩存

  • 只讀常量緩存

  • 只讀紋理緩存

每個(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)的讀取性能,。

總結(jié)
圖片
此文轉(zhuǎn)自CSDN 武漢大學(xué)計(jì)算機(jī)學(xué)院智能計(jì)算系統(tǒng)實(shí)驗(yàn)室

 https://blog.csdn.net/weixin_51971301/article/details/124703677

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多