滚动新闻:
首页 > 客户服务 > 技术支持

【CUDA】CUDA编程接口:纹理存储器的参考属性

  本文将讲述CUDA编程接口中关于纹理存储器的基础知识,包括以下内容:纹理参考属性的相关概念、纹理参考的声明和运行时纹理参考属性。

  CUDA支持纹理硬件的一个子集,GPU为图形使用这个子集访问纹理存储器和表面存储器。后文将介绍到,从纹理存储器或表面存储器而不是全局存储器中读数据有许多性能好处。在内核中,调用纹理获取设备函数读纹理存储器。纹理获取的第一个参数指定的对象称为纹理参考。

  纹理参考定义了被获取的纹理存储器部分。如前文(见“相关阅读”中的文章)所述,纹理参考在被内核使用之前,必须使用运行时函数绑定到存储器的某个区域,这个区域称为纹理。多种不同的纹理参考可能绑定到同一纹理或者绑定到存储器重叠的纹理。 纹理参考有许多属性。其中之一就是维数,维数指定纹理是作为一维的数组使用一个纹理坐标、二维数组使用两个纹理坐标、还是三维数组使用三维坐标来寻址。数组的元素称为texels,是纹理参考元素的简称。如前文(见“相关阅读”中的文章)所述,纹理也可以是层次(layered)纹理。 其它属性定义纹理获取的输入输出数据类型,也包括怎样解释输入坐标和要做那些处理。 纹理可以是线性存储器的任何一个区域或者一个CUDA数组(参见“相关阅读”中的内容),文中列出了依据设备计算能力列出了最大的纹理宽度、高度和深度。

  纹理参考声明

  纹理参考的一些属性不可变并且在编译时必须知道;它们在声明纹理参考时指定。纹理参考必须在文件域内声明,变量类型为texture;

  texture texRef;

  其中:

  ①DataType指定纹理获取时的返回的数据类型,DataType限制为基本的整形和单精度浮点型和B.3.1节定义的1,2和4个组件的向量类型的任何一个。

  ②Type指定纹理参考的类型,且等于cudaTextureType1D(一维纹理), cudaTextureType2D(二维纹理)或cudaTextureType3D(三维纹理),或者cudaTextureType1Dlayered(一维层次纹理)或cudaTextureType2Dlayered(二维层次纹理),Type是可选的,默认为cudaTextureType1D;

  ③ReadMode等于cudaReadModeNormalizedFloat或cudaReadModeElementType;如果它是cudaReadModeNormalizedFloat且DataType是16位或者8位整形,实际返回值是浮点类型,对于无符号整型,整形全范围被映射到[0.0,1.0],对于有符号整型,映射成[-1.0,1.0];例如,无符号八位值为0xff的纹理元素映射为1;如果ReadMode是cudaReadModeElementType,不会进行转换;ReadMode是个可选参数,默认为cudaReadModeElementType。

  纹理参考只能被声明为全局静态变量,且不能作为函数的参数传递。

  运行时纹理参考属性

  纹理参考的其它属性是可变的,并且能够在运行时通过主机运行时改变。这些属性指定纹理坐标是否归一化、寻址模式和纹理滤波,细节如下。

 

  默认情况下,纹理使用[0,N)范围内的浮点坐标引用,其中N是坐标对应维度的尺寸。例如,尺寸为64*32的纹理可引用的坐标范围是x维[0,63]和y维[0,31]。归一化的纹理坐标范围指定为[0.0,1.0)而不是[0,N),所以同样的64*32纹理的归一化坐标x维和y维可寻址范围都是[0,1)。归一化的纹理坐标天然的符合某些应用的要求,如果为了让纹理坐标独立于纹理尺寸,就更可取了。 寻址模式定义了当纹理坐标越界时发生了什么了。当使用非归一化纹理坐标时,纹理坐标在[0,N)范围之外的被钳位(clamp):小于0的设置为0而大于等于N的设置为N-1。钳位也是使用归一化纹理坐标时默认的寻址模式:小于0.0或大于1.0钳位到[0.0,1.0)范围。对于归一化坐标,也可以指定为循环寻址模式。一般在纹理有周期性信号时使用循环模式。循环模式只使用纹理坐标的小数部分;如1.25和0.25等同,-1.25和0.75等同。 线性纹理滤波只能对返回值为浮点型的纹理配置起作用。它在周围的纹理元素点上执行低精度插值。如果启用滤波,纹理获取点周围的点被读取,纹理获取点的返回值基于那些纹理获取点坐标落入那些元素中间的元素进行插值。对于一维的纹理进行简单的线性插值,二维纹理使用双线性插值, 而三维纹理使用三线性插值。