13

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

从我所见,似乎cudaArray应该用于纹理和指针应该用于直接访问内存。似乎也只能使用cudaArray. 是否应该使用 分配所有纹理cudaArray?许多例子似乎没有。另外,为什么有一个函数cudaMallocArrayand cudaMallocArray3D,但没有等价的cudaMallocArray2D?相反,有一个cudaBindTextureand cudaBindTexture2D,但没有cudaBindTexture3D?

4

2 回答 2

22

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

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

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

cudaMallocArray()实际上分配了一个二维数组,所以我认为问题只是命名不一致。也许这样称呼它更合乎逻辑cudaMallocArray2D()

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

于 2013-01-22T03:27:02.850 回答
2

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

于 2016-05-18T10:50:17.967 回答