纹理和表面内存:
CUDA支持GPU用于图形访问纹理和表面内存的纹理硬件的一个子集。 从纹理或表面存储器而不是全局存储器读取数据可能具有多种性能优势,如器件存储器访问中所述。
有两种不同的API来访问纹理和表面内存:
- 所有设备都支持的纹理参考API,
- 纹理对象API仅在计算能力3.x的设备上受支持。
纹理参考API具有纹理对象API不具有的限制。
纹理内存:
纹理内存是使用纹理函数中描述的设备函数从内核中读取的。 读取调用这些函数之一的纹理的过程称为纹理拾取。 每个纹理获取指定一个称为纹理对象的参数,用于纹理对象API或纹理参考API的纹理参考。
纹理对象或纹理参考指定:
- 纹理,这是获取的纹理内存块。 纹理对象是在运行时创建的,并且在创建纹理对象时指定纹理,如纹理对象API中所述。 纹理引用是在编译时创建的,并且纹理是在运行时通过将纹理引用绑定到纹理通过运行时函数来指定的,如纹理参考API中所述; 几个不同的纹理参考可能会绑定到相同的纹理或纹理,在内存中重叠。 纹理可以是线性内存或CUDA阵列的任何区域(在CUDA Arrays中描述)
- 其维度指定纹理是使用一个纹理坐标,使用两个纹理坐标的二维数组,还是使用三个纹理坐标的三维数组来处理的一维数组。 数组的元素称为纹理元素,即纹理元素的简称。 纹理宽度,高度和深度是指每个维度中数组的大小。 表14列出了根据设备计算能力的最大纹理宽度,高度和深度。
- texel的类型,限于基本的整数和单精度浮点类型,以及在char,short,int,long,longlong,float等中定义的1,2和4分量矢量类型。 double是从基本整数和单精度浮点类型派生而来的。
- 读模式,它等于cudaReadModeNormalizedFloat或cudaReadModeElementType。 如果它是cudaReadModeNormalizedFloat,并且纹理元素的类型是16位或8位整数类型,则纹理拾取返回的值实际上是作为浮点类型返回的,整数类型的整个范围被映射为[0.0 ,1.0]为无符号整数类型,[-1.0,1.0]为有符号整数类型; 例如,具有值0xff的无符号8位纹理元素读取为1.如果是cudaReadModeElementType,则不执行转换。
- 纹理坐标是否标准化 默认情况下,使用在[0,N-1]范围内的浮点坐标来引用纹理(通过纹理函数的函数),其中N是对应于坐标的尺寸中的纹理的尺寸。 例如,大小为64x32的纹理将分别以x和y维度的范围[0,63]和[0,31]范围内的坐标引用。 规格化的纹理坐标会导致在[0.0,1.0-1 / N]范围内指定坐标而不是[0,N-1],因此相同的64x32纹理将通过范围[0,1- 1 / N]的x和y维度。 如果纹理坐标最好独立于纹理大小,则规范化的纹理坐标自然适合某些应用的要求
- 寻址模式。使用超出范围的坐标调用B.8节的设备功能是有效的。寻址模式定义了在这种情况下发生的事情。默认寻址模式是将坐标限制在非标准化坐标的有效范围:[0,N),对于标准化坐标,为[0.0,1.0]。如果指定了边框模式,则使用超范围纹理坐标的纹理拾取返回零。对于标准坐标,换行模式和镜像模式也是可用的。当使用换行模式时,每个坐标x被转换为frac(x)= x floor(x),其中floor(x)是不大于x的最大整数。当使用镜像模式时,如果floor(x)是偶数,则每个坐标x转换为frac(x);如果floor(x)是奇数,则每个坐标x转换为1-frac(x)。寻址模式被指定为大小为三的数组,其第一,第二和第三元素分别指定第一,第二和第三纹理坐标的寻址模式;寻址模式是cudaAddressModeBorder,cudaAddressModeClamp,cudaAddressModeWrap和cudaAddressModeMirror; cudaAddressModeWrap和cudaAddressModeMirror仅支持标准化的纹理坐标
- 指定如何根据输入的纹理坐标计算获取纹理时返回的值的过滤模式。线性纹理过滤只能用于配置为返回浮点数据的纹理。它执行相邻纹素之间的低精度插值。启用时,将读取纹理拾取位置周围的纹理元素,并根据纹理坐标位于纹理元素之间的位置插值纹理拾取的返回值。对一维纹理执行简单线性插值,对二维纹理执行双线性插值,对三维纹理执行三线性插值。纹理抓取给出了更多的纹理拾取细节。过滤模式等于cudaFilterModePoint或cudaFilterModeLinear。如果是cudaFilterModePoint,则返回的值是纹理坐标与输入纹理坐标最接近的纹理元素。如果是cudaFilterModeLinear,则返回的值是两个(对于一维纹理),四个(对于二维纹理)或八个(对于三维纹理)纹理坐标最接近的纹理元素的线性插值输入纹理坐标。 cudaFilterModeLinear仅对浮点类型的返回值有效