【IT168 文档】(一)纹理属性
(二)纹理拾取函数
(三)拾取纹理内存与读取全局或常量内存相比的优点
(一)纹理属性
纹理可以在线性内存或是CUDA数组(纹理内存)的任何区域。所以纹理拾取也就对存在与线性内存或CUDA数组中的纹理读取数据。
共用运行组件(既可以运行在host又可以运行在设备)中给出了纹理类型texture。纹理拾取的第一个参数就是纹理参考,纹理参考定义要拾取哪部分纹理内存,它必须通过宿主运行时(只运行在宿主上)函数绑定到一些内存区域(称为纹理(texture)),然后才能供内核使用。下面就来看看纹理参考的不可变属性和可变属性。
不可变属性
纹理参考的声明是texture texRef;Type、Dim和ReadMode都是不可变属性。其中:
Type指定拾取纹理时返回的数据类型;Type限制为基本的整数和浮点数类型,以及1-、
2-和4-分量的向量类型之一。
Dim指定纹理参考的维度,等于1、2或3;Dim是可选参数,缺省值为1;
ReadMode等于cudaReadModeNormalizedFloat或
cudaReadModeElementType。如果;ReadMode为cudaReadModeNormalizedFloat,且Type为16-位或8-位整数类型,则其值实际返回值为浮点数类型,即根据原整数类型的全范围进行归一化处理,结果被映射到 [0.0, 1.0]区间(对于无符号整数)或[-1.0, 1.0]为区间(对于有符号整数);例如,值0xff的无符号8-位纹理元素返回值为1;如果ReadMode为cudaReadModeElementType,则不执行任何转换;ReadMode是可选参数,默认为cudaReadModeElementType.
可变属性
纹理参考的可变属性包括寻址模式、纹理过滤和纹理坐标是否归一化。这些属性都是执行宿主运行时改变的,如cudaBindTextureToArray()执行时在硬件纹理单元(texture units)时。其中:
addressMode,即如何处理超出范围的纹理坐标。寻址模式是大小为2的数组,数组的第一个和第二个元素分别指定第一个第二个纹理坐标的寻址模式:当寻址模式等于cudaAddressModeClamp时,超出范围的纹理坐标将使用clamp寻址:非归一化纹理坐标的情况下,小于0的值设置为0,大于等于N的值设置为N-1;归一化纹理坐标的情况下,小于0.0或大于1.0的值设置到区间[0.0,1.0)中。当寻址模式是cudaAddressModeWarp时,超出范围的纹理坐标使用warp模式:warp寻址仅使用纹理坐标的小数部分:如1.25当作0.25处理,-1.25当作0.75处理。默认情况下是cudaAddressModeClamp。cudaAddressModeWarp只支持归一化的纹理坐标。
filterMode,过滤模式即当拾取纹理时,如何基于输入纹理坐标来计算返回的值。filterMode等于cudaFilterModePoint或cudaFilterModeLinear;如果它为cudaFilterModePoint,则返回值是纹理坐标最接近输入纹理坐标的纹理元素;如果它为cudaFilterModeLinear,则返回值是纹理坐标最接近输入纹理坐标的2个(对于1D纹理)、4个(对于1个2D纹理)或8给(对于3D纹理)的纹理元素的线性插值。cudaFilterModeLinear只对返回值是浮点类型有效。
normalize,指定纹理坐标是否是归一化的;如果其值非0,则纹理中的所有元素都使用区间[0,1],而非区间[0,width-1]、[0,height-1]或[0,depth-1]中的纹理坐标来寻址,其中width、height和depth是纹理大小。
在线性内存中分配的纹理:
- 维度只能等于1;
- 不支持纹理过滤;
- 只能使用非归一化的整数纹理坐标寻址;
- 寻址模式单一:越界的纹理访问将返回0值。