CUDA中的纹理内存:用于演示性能的概念和简单示例

时间:2012-01-07 03:17:11

标签: cuda

我正在阅读Simon Green撰写的名为Particle Simulation with CUDA的NVIDIA白皮书。

它描述了SDK粒子示例和使用的算法。

在讨论代码的性能时,作者说粒子的位置和速度的全局存储器阵列“绑定”到纹理。

现在我对纹理记忆的概念感到非常困惑。 NVIDIA CUDA编程指南在没有任何示例的情况下经历了一些非常血腥和困难的解释。

因此我有两个问题:

  1. 有人可以给我/推荐一个非常简单的(假人的纹理记忆)示例如何使用纹理提高性能。

  2. 第40页的CUDA编程指南4.0说明“纹理可以是线性存储器的任何区域或CUDA阵列”。现在,如果(如上所述),纹理内存提供比全局内存更好的性能,为什么不将整个全局内存“绑定”到纹理内存?

1 个答案:

答案 0 :(得分:24)

  1. cuda SDK包含一个简单的示例simpleTexture,演示了使用纹理执行简单的2D坐标转换。
  2. 首先要记住的是纹理内存全局内存。唯一的区别是纹理是通过专用的只读缓存访问的,缓存包括硬件过滤,它可以执行线性浮点插值作为读取过程的一部分。然而,高速缓存与传统高速缓存不同,因为它针对空间局部性(在纹理的坐标系中)而非针对存储器中的局部性进行了优化。对于某些应用程序,这是理想的,并且由于缓存和可以从过滤硬件获得的免费FLOP而提供性能优势,但对于其他应用程序,它不会和纹理更慢因为除了全局内存读取之外,访问还涉及缓存未命中惩罚,并且不需要插值。
  3. 因此粒子模拟之类的东西可以从纹理中受益,因为计算通常在考虑局部相互作用的单元格或控制体积中执行,而相邻粒子需要访问彼此的速度和加速度。与简单的线性内存缓存相比,空间本地缓存更适合这种情况。但对于其他应用程序,内存访问模式中没有固有的空间局部性,纹理与传统的缓存内存相比几乎没有任何好处。