cudaArray与设备指针

时间:2013-01-22 01:14:34

标签: arrays cuda textures

我对设备指针和cudaArray结构的预期用途之间的区别感到困惑。有人可以解释为什么我会使用一个与另一个?我的基本问题是,在查看文档并阅读“CUDA by example”一书后,我不明白API设计者的意图。

从我所看到的,似乎cudaArray应该用于纹理,指针应该用于直接访问内存。似乎只能使用cudaArray创建3D纹理。是否应使用cudaArray分配所有纹理?许多例子似乎都没有。另外,为什么有一个函数cudaMallocArraycudaMallocArray3D,但没有cudaMallocArray2D的等价函数?相反,有cudaBindTexturecudaBindTexture2D,但没有cudaBindTexture3D

2 个答案:

答案 0 :(得分:20)

cudaArray是一个不透明的内存块,针对绑定纹理进行了优化。纹理可以使用存储在space filling curve中的内存,由于更好的2D空间局部性,这允许更好的纹理缓存命中率。将数据复制到cudaArray会使其格式化为这样的曲线。

因此,将数据存储在cudaArray中是一种优化技术,可以产生更好的纹理缓存命中率。在早期的CUDA架构中,内核也无法访问cudaArray。但是,计算能力> = 2.0的体系结构可以通过CUDA表面访问数组。

确定是否应在全局内存中使用cudaArray或常规缓冲区,这取决于内存的预期用法和访问模式。它将是项目特定的。

cudaMallocArray()实际上分配了一个2D数组,所以我认为问题只是命名不一致。将它称为cudaMallocArray2D()可能更合乎逻辑。

我没有使用3D纹理。希望有人会回答并让我们知道为什么不需要cudaBindTexture3D()

答案 1 :(得分:2)

您可以使用cudaBindTextureToArray,它适用于2D和3D。