CUDA C程式設計手冊 程式設計介面(六)

2021-10-07 07:10:36 字數 2386 閱讀 3621

對於計算力高於2.0的裝置,使用cudaarraysu***celoadstore標誌建立的cuda陣列, 可以通過su***ce object.或者su***ce reference進行讀寫。不同的裝置,所支援的表面記憶體的大小是不一樣的。

表面物件的描述可以使用struct cudaresourcedesc來表示並通過呼叫cudacreatesrufaceobject()來進行建立。

下示**演示了對紋理進行簡單變換的核函式的使用:

// ****** copy kernel

__global__ void copykernel(cudasu***ceobject_t inputsurfobj,

cudasu***ceobject_t outputsurfobj,

int width, int height)

}// host code

int main()

表面引用的宣告的作用範圍只是在檔案 內:

su***cesurfref;
其中,type指明了表面引用的型別,它可以是cudasurgacetype1d、cudasurgacetype2d、cudasurgacetype3d、cudasurgacetypecubemap、cudasurgacetype1dlayered、cudasurgacetype2dlayered、cudasurgacetypecubemaplayered。該引數的預設值是cudasurgacetype1d。乙個表面紋理引用只能夠被宣告為全域性靜態變數,且不能夠作為引數傳遞給函式。

在核函式使用表面引用來訪存cuda 陣列前, 表面引用必須使用cudabindsu***cetoarray()來與相應的陣列進行繫結。

下面的**演示了如何進行繫結:

// low-level api

su***cesurfref;

su***cereference* surfrefptr;

cudagetsu***cereference(&surfrefptr, "surfref");

cudachannelformatdesc channeldesc;

cudagetchanneldesc(&channeldesc, cuarray);

cudabindsu***cetoarray(surfref, cuarray, &channeldesc);

// high-level api

su***cesurfref;

cudabindsu***cetoarray(surfref, cuarray);

乙個cuda 陣列使用表面引用來進行讀寫時,維度和資料型別必須相匹配,否則是未定義的行為。不像紋理記憶體,表面記憶體使用的是位元組定址。也就是說,通過紋理函式來獲取 x軸方向的紋理元的時後直接使用就可以了,而在表面函式需要乘上元素對應的位元組大小。例如, 一維的浮點型cuda 陣列被繫結至紋理引用texref時使用tex1d(texref,x)來進行獲取,而當繫結至surfref時需要使用**surf1dread(surfref, 4*x)**來進行獲取。

下示**是對紋理使用了一些簡單的變換。

// 2d su***ces

su***ceinputsurfref;

su***ceoutputsurfref;

// ****** copy kernel

__global__ void copykernel(int width, int height)

}// host code

int main()

cubemap表面的訪存使用surfcubemapread()和surfcubemapwrite()來實現。它通常被當做二維layered表面,使用乙個整數索引來標記乙個面,兩個浮點數來定址該面對應層內的紋理元。面的儲存順序可以通過查閱相關資料得知。

cubemap表面的訪存使用surfcubemaplayeredread()和surfcubemaplayeredwrite()來實現。它通常被當做二維layered表面,使用乙個整數索引來標記乙個cubemap中的乙個面,兩個浮點數來定址該面對應層內的紋理元。面的儲存順序可以通過查閱相關資料得知。

cuda 陣列為了方便紋理的fetching, 其記憶體排布是經過了優化的,因此對外是不透明的。它可以是一維的、二維的、三維的或者是多種元素的組合。核函式對cuda 陣列的訪存只能通過紋理的fetching或者表面的讀寫。

紋理和表面記憶體是被快取的,在同乙個核函式呼叫時, 快取並不會與全域性記憶體中保持一致。也就是說,乙個執行緒只會在前乙個核函式呼叫更新後後者記憶體拷貝之後才可以安全地讀紋理或表面。如果是被核函式內的同乙個執行緒或者其他執行緒更新再進行讀取是不安全的。

CUDA C程式設計手冊 程式設計介面(五)

cuda支援使用一小部分gpu用於圖形顯示的紋理硬體來對紋理記憶體和表面記憶體進行訪問。相比於從全域性記憶體,從紋理或者表面記憶體中讀取資料的在之前的裝置記憶體章節已經進行了介紹。有兩類api 用來完成對紋理和表面記憶體進行使用 紋理引用api在所有的裝置都能使用 紋理物件api只支援在計算力大於3...

《CUDA C程式設計權威指南》 2 6 習題

1.在檔案sumarraysongpu timer.cu中,設定block.x 1 023,重新編譯並執行。與執行配置為block.x 1 024的執行結果進行比較,試著解釋其區別和原因。2.參考檔案sumarraysongpu timer.cu,設定block.x 256。新建乙個核心,使得每個執...

《CUDA C程式設計權威指南》 1 5 總結

隨著計算機架構和並行程式設計模型的發展,逐漸有了現在所用的異構系統。cuda平台幫助提高了異構架構的效能和程式設計師的工作效率。cpu gpu的異構系統在高效能計算領域已經成為主流。這種變化使並行設計範例有了根本性轉變 在gpu上執行資料並行工作,而在cpu上執行序列和任務並行工作。作為完整的gpu...