我对设备指针和cudaArray
结构的预期用途之间的区别感到困惑。有人可以解释一下为什么我要使用一个而不是另一个吗?我的基本问题是,在阅读了文档并阅读了“ CUDA by Example”这本书之后,我不了解API设计人员的意图。
从我所看到的来看,似乎cudaArray
应该用于纹理,而指针应该用于直接访问内存。似乎3D纹理只能使用cudaArray
创建。是否应该使用cudaArray
分配所有纹理?许多例子似乎并非如此。另外,为什么会有功能cudaMallocArray
和cudaMallocArray3D
,但cudaMallocArray2D
没有等效功能?相反,有cudaBindTexture
和cudaBindTexture2D
,但没有cudaBindTexture3D
吗?
最佳答案
cudaArray
是不透明的内存块,已针对绑定纹理进行了优化。纹理可以使用存储在space filling curve中的内存,由于具有更好的2D空间局部性,因此可以提高纹理缓存的命中率。将数据复制到cudaArray
将导致将其格式化为这种曲线。
因此,将数据存储在cudaArray
中是一种优化技术,可以产生更好的纹理缓存命中率。在早期的CUDA体系结构中,cudaArray
也不能被内核访问。但是,计算能力大于等于2.0的体系结构可以通过CUDA表面访问阵列。
确定是否应在全局内存中使用cudaArray
或常规缓冲区取决于该内存的预期用法和访问模式。这将是特定于项目的。cudaMallocArray()
实际上分配了一个2D数组,所以我认为问题只是命名不一致。也许将其称为cudaMallocArray2D()
更为合乎逻辑。
我没有使用3D纹理。希望有人会回答并让我们知道为什么不需要cudaBindTexture3D()
。