2013-01-22 78 views
8

我對設備指針和cudaArray結構的預期用途之間的區別感到困惑。有人能解釋爲什麼我會使用一個與另一個?我的基本問題是,在查看文檔並閱讀「CUDA示例」一書後,我不明白API設計人員的意圖。cudaArray與設備指針

從我所看到的,cudaArray應該用於紋理和指針應該用於直接訪問內存。似乎也只能使用cudaArray創建3D紋理。是否所有的紋理都應該使用cudaArray進行分配?許多例子似乎都沒有。此外,爲什麼有一個功能cudaMallocArraycudaMallocArray3D,但沒有相當於cudaMallocArray2D?相反,有cudaBindTexturecudaBindTexture2D,但沒有cudaBindTexture3D

回答

16

cudaArray是一個不透明的內存塊,它針對綁定到紋理進行了優化。紋理可以使用存儲在space filling curve中的內存,由於更好的2D空間局部性,這允許更好的紋理緩存命中率。將數據複製到cudaArray將使其被格式化爲這樣的曲線。

因此,將數據存儲在cudaArray是一種優化技術,可以產生更好的紋理緩存命中率。在早期的CUDA架構上,cudaArray也不能被內核訪問。但是,計算能力> = 2.0的體系結構可以通過CUDA表面訪問陣列。

確定是否應該使用cudaArray或全局內存中的常規緩衝區歸結爲內存的預​​期使用和訪問模式。這將是項目特定的。

cudaMallocArray()實際上分配了一個二維數組,所以我認爲這個問題只是不一致的命名。也許將它稱爲cudaMallocArray2D()更合乎邏輯。

我還沒有使用3D紋理。希望有人會回答並告訴我們爲什麼不需要cudaBindTexture3D()

1

您可以使用cudaBindTextureToArray,它適用於2D和3D。