纹理存储器(texture memory)是一种只读存储器,由GPU用于纹理渲染的的图形专用单元发展而来,因此也提供了一些特殊功能。纹理存储器中的数据位于显存,但可以通过纹理缓存加速读取。在纹理存储器中可以绑定的数据比在常量存储器可以声明的64K大很多,并且支持一维、二维或者三维纹理。在通用计算中,纹理存储器十分适合用于实现图像处理或查找表,并且对数据量较大时的随机数据访问或者非对齐访问也有良好的加速效果。
纹理存储器在硬件中并不对应一块专门的存储器,而实际上是牵涉到显存、两级纹理缓存、纹理抓取单元的纹理流水线。纹理存储器提供了地址映射、数据滤波、缓存等功能,这些功能都是围绕着纹理渲染的需求设计的。关于GPU纹理流水线的介绍可以参考本书3.3.3节。在CUDA编程模型中,纹理缓存是透明的,编程人员不用去了解它的实现机制。
从CUDA的内核函数访问纹理存储器的操作被称为纹理拾取(texture fetching)。纹理拾取使用的坐标与数据在显存中的地址可以不同,两者通过纹理参照系(texture reference)约定从数据的地址到纹理坐标的映射方式。将显存中的数据与纹理参照系关联的操作,称为将数据与纹理绑定(texture binding)。显存中可以绑定到纹理的数据有两种,分别是普通的线性内存(Linear Memroy)和CUDA数组(CUDA Array)。CUDA数组则为纹理访问进行了优化,并且在Device端中只能通过纹理拾取访问。
绑定到纹理的线性内存和数组中的元素被称为像元(texels),是texture elements的缩写。像元的数据类型可以是其中的元素可以是CUDA中规定的1,2或者4元组(不能是3元组)的有符号或者无符号8-,16-,32-bit整型或者16-bit(目前只能通过driver API支持)整型,以及32-bit浮点型数据。与CUDA数组绑定的纹理参照系中的元素使用的N-元组数据中的组件数量必须与CUDA数组相同。 |