技术开发 频道

CUDA Texture Part.1 簡介

  【IT168 文档】在執行 CUDA 程式前,都要把資料先從 Host 的記憶體,複製一份到 device 的記憶體中;一般來說,這樣的部分,都是使用 device 的 global memory 來直接進行存取。不過實際上,有的時候還有別的選擇的~在《nVidia CUDA 簡介》中一文就有提到,除了 global memory 外,還可以透過 constant memory 或 texture memory 的形式,來對 device memory 資料的存取。

  texture 是一般 graphics 裡的名詞,2D texture 大致上可以理解為一張圖片,一般應該是翻譯成材質(維基百科是稱為「紋理」);而由於在傳統的 render pipeline 中,texture 佔了很重要的地位,所以在顯示卡的部分,也會對這部分做特殊的非常好的化。而在 nVidia 的 CUDA 中,也把 texture 這項元素保留下來了!

  如果在 CUDA 中把 device memory 的資料,當作使用 texture 的話,那資料會變成是唯讀的,要透過特殊的函式來讀取,沒有辦法進行修改;不過相對的,和 global memory 或 constant memory 比起來,也有不少優點~(詳細資料請參考《CUDA Programming Guide 1.1》的 5.4)

  有快取,在某些狀況下頻寬會比較大

  不像 global/constant memory 要依照某些存取模式下才有比較好的效能

  位置計算的延遲被隱藏得更好,對於隨機存取資料的效能可能更好

  被封包過的資料可以在一個運算中被個別的變數使用

  8bit 和 16bit 整數可以簡單的轉換成 [0.0, 1.0] 或 [-1.0, 1.0]

  除了上述的優點外,如果使用 CUDA Array 來當 texture 的話,更可以套用 filter、使用內建的功能來做內插取值、並且設定要用 clamping 或 repeat 模式處理邊界。

  而在 CUDA 中,要使用 texture 的話,是要使用所謂的「texture reference」;下面就大概來介紹 CUDA 中 texture 的使用方法。首先,他的大致流程會是:

  •   Host 的 texture 建立部分

  宣告出 texture reference

  透過 Bind Texture 的函式,將 texture reference 和現有的 device memory 上的變數(linear memory 或 CUDA array)做連結

  •   Device 使用

  透過 CUDA 提供的 texture 讀取函式(tex1Dfetch, tex1D, tex2D)來讀取 texture 的內容

  •   Host 刪除 texture

  呼叫 unbind texture 的函式,將 texture reference 的資源釋放

  不過,在 CUDA 中,對於 texture 的控制,有 low-level 和 high level 兩種,Heresy 在這就先針對比較簡單的 high-level 方法來做一些簡單的說明。

0
相关文章