CUDA 優化的一些措施

2021-06-18 12:43:08 字數 1910 閱讀 8050

一   在儲存器方面的優化

1.主機的記憶體分配

為了防止程式中分配的記憶體為分頁記憶體,有被置換出記憶體條的可能,可以呼叫cudaallochost函式來建立主機記憶體為非分頁記憶體。這樣在從主機至裝置,裝置至主機的記憶體複製操作時,可以大幅減小操作耗時,但是有個劣勢是非分頁記憶體始終佔據記憶體條空間。

2.gpu上,執行緒函式對全域性儲存器的訪問優化(合併訪問)

由於gpu上全域性記憶體為對齊好的(如,呼叫cudamalloc分配的儲存器,能夠保證其首位址至少會按256byte進行對齊)。gpu高效能計算之cuda  這本書上說:儲存操作的吞吐量是每個時鐘週期8個操作。當訪問local/global memory的時候會有額外的400~600個時鐘週期的訪問延遲。

乙個half-warp內的執行緒訪問的位址如果是連續的,則它們對全域性儲存器的訪問可以進行合併訪問(假如訪問的首位址是64byte的整數倍,即段對齊,合併訪問一次就夠)。若乙個half-warp內線程訪問的位址是間隔很大,那麼它們對全域性儲存器的訪問將會做很多次,從而大幅增加程式執行時間。

3。gpu上,執行緒函式對共享儲存器的訪問優化(bank conflict)

gpu上,shared memory 的訪問延遲只有local/global memory的百分之一,訪問速度很快(因為它位於gpu片內)。

shared memory 被劃分為大小相等,能被同時訪問的儲存器模組,並稱其為bank。由於不同儲存器(bank)可以互不干擾的同時工作,因此對位於n個bank的n個位址的訪問能同時進行,此時有效頻寬是同時對單個bank的n個資料訪問的n倍。

bank的組織方式為:每個bank的寬度為32bit,相鄰的32bit字被組織在相鄰的bank中,每個bank在每個時鐘週期可以提供32bit的頻寬。

乙個half-warp的16個執行緒對shared memory 訪問並不是在不同的bank中時,就會發生bank conflict。

4.常數儲存器的使用。

常數儲存器的資料位於視訊記憶體,但其擁有快取加速。每個sm有8kb的常數儲存器快取(不知道對不同的卡,此值是否一致)。

若有大尺寸的查詢表等常數陣列,可以考慮放入常數儲存器中,以獲得快取的訪問加速。在相機標定中可以用用看。

5。紋理儲存器的使用

紋理儲存器能夠通過快取利用資料,只要用來存放影象和查詢表。它在硬體上實現線性插值,很適合做影象幾何變換。

二,指令流的優化

1.指令流並行

通常會講到讓主機對gpu的記憶體拷貝、核心函式執行做非同步處理

但在gpu內線程裡面的指令也可以通過指令並行,獲得好的加速效果。gpu高效能計算之cuda  書裡的matrixmul2例子(難理解,但是很妙),其實也用了指令並行,雖然它沒有指名說。

如果上下兩條指令沒有邏輯關係,那麼不等確認第一條執行完畢,第二條就會被執行,就像並行一樣。也就是說,可以通過指令並行,實現隱蔽掉訪存等操作的延時。

對於前後無關的迴圈,可以通過#pragma unroll 指令,使for迴圈展開執行,從而使其指令並行。

2. 算數運算的耗時。

gpu單元對 除法和取餘等操作的執行時比較慢的,除法操作是每個週期小於1個操作,對三角函式 sinf(x)、cosf(x)、exp(x),也是乙個週期1個操作。

gpu對單精度浮點數的運算一般比整數算術運算好,如:單精度浮點數的乘法和乘加操作時是 每週期8個操作,而對32bit整數乘是每週期2操作。對整數除和模運算的開銷特別大,應該盡量避免,或是用位運算代替。

我在程式設計中發現: (gpu核心函式的片段)       

float tu = u*cosf(theta) - v*sinf(theta) + 0.5f;

float tv = v*cosf(theta) + u*sinf(theta) + 0.5f;

if(x如果不加兩條紅色指令,執行時長為0.35ms,加上後就成4ms了。這裡也是有個疑問,按說訪存指令存在延遲在幾百個週期,遠比算數指令慢,但加了三角函式運算,竟然差距這般大。

OpenGL 反鋸齒的一些措施

1.使用顏色混合來消除一些鋸齒,主要針對點和線以及不相互重疊的多邊形的反鋸齒。反鋸齒設定 如下 glblendfunc gl src alpha,gl one minus src alpha glenable gl blend glenable gl point smooth glhint gl p...

關於CUDA的一些學習資料

最近看了一些關於cuda方面的資料,並粗略地瀏覽了兩本關於cuda和gpgpu的書 gpgpu程式設計技術 從glsl cuda到opencl 和 cuda並行程式設計 gpu程式設計指南 對於cuda目前本人也是處於正在入門的階段。在此彙編cuda的學習資料,方便以後的學習。所謂gpgpu,就是把...

關於CUDA的一些學習資料

最近看了一些關於cuda方面的資料,並粗略地瀏覽了兩本關於cuda和gpgpu的書 gpgpu程式設計技術 從glsl cuda到opencl 和 cuda並行程式設計 gpu程式設計指南 對於cuda目前本人也是處於正在入門的階段。在此彙編cuda的學習資料,方便以後的學習。所謂gpgpu,就是把...