cudaArray与设备指针的区别

14

我对设备指针和cudaArray结构的使用目的有些困惑。请问有人可以解释一下为什么我要使用其中之一吗?我的基本问题是,在查阅文档和阅读书籍“CUDA by Example”后,我不理解API设计者的意图。

根据我所看到的,似乎应该使用cudaArray来处理纹理,而指针则用于直接访问内存。另外,好像只有使用cudaArray才能创建3D纹理。所有纹理都应该使用cudaArray来分配吗?许多示例似乎没有这样做。此外,为什么有cudaMallocArraycudaMallocArray3D函数,但没有相应的cudaMallocArray2D函数?相反地,有cudaBindTexturecudaBindTexture2D函数,却没有cudaBindTexture3D函数呢?

2个回答

24

cudaArray 是一种优化绑定到纹理的内存不透明块。纹理可以使用在填充空间曲线中存储的内存,这允许更好的二维空间局部性,从而获得更好的纹理缓存命中率。将数据复制到 cudaArray 将导致其被格式化为这样的曲线。

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

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

cudaMallocArray() 实际上分配了一个二维数组,所以我认为问题只是名称不一致。也许将其命名为 cudaMallocArray2D() 更合理。

我没有使用过三维纹理。希望有人能回答并告诉我们为什么不需要 cudaBindTexture3D()


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接