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

smi*_*dha 17 cuda

我正在阅读由Simon Green 撰写的题为" 使用CUDA进行粒子模拟 "的NVIDIA白皮书.

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

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

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

因此我有两个问题:

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

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

tal*_*ies 24

  1. cuda SDK包含一个简单的示例simpleTexture,演示如何使用纹理执行简单的2D坐标转换.
  2. 首先要记住的是纹理内存全局内存.唯一的区别是纹理是通过专用的只读缓存访问的,缓存包括硬件过滤,它可以执行线性浮点插值作为读取过程的一部分.然而,高速缓存与传统高速缓存不同,因为它针对空间局部性(在纹理的坐标系中)而非针对存储器中的局部性进行了优化.对于某些应用程序,这是理想的,并且由于缓存和可以从过滤硬件获得的免费FLOP而提供性能优势,但对于其他应用程序,它不会和纹理可能会更慢,因为访问涉及缓存未命中惩罚除了全局内存读取之外,不需要插值.

因此粒子模拟之类的东西可以从纹理中受益,因为计算通常在考虑局部相互作用的单元格或控制体积中执行,并且相邻粒子需要访问彼此的速度和加速度.与简单的线性内存缓存相比,空间本地缓存更适合这种情况.但对于其他应用程序,内存访问模式中没有固有的空间局部性,并且纹理与传统的缓存内存相比几乎没有或没有任何好处.

  • 是否还包括单精度浮点值?在CUDA 4.0编程指南的第40页上,它说"纹理引用在文件范围内声明为*texture <DataType,Type,ReadMode> texref*类型的变量,其中*DataType*定义获取时的数据类型texture和*Type*仅限于基本整数和单精度浮点类型......" (2认同)
  • 你应该查看Cyril Crassin(Gigavoxels)的工作,了解如何最好地优化GPU的oct-tree http://maverick.inria.fr/Members/Cyril.Crassin/ (2认同)