(二)纹理拾取函数
纹理拾取函数是设备运行时函数。纹理存储的区间不同,拾取的方式也不同。
从线性内存中拾取,使用的函数是tex1Dfetch()的函数簇。如:
Type tex1Dfetch(
texture<Type, 1, cudaReadModeElementType> texRef, int x);
float tex1Dfetch(
texture<unsigned char, 1, cudaReadModeNormalizedFloat> texRef,
int x);
这些函数用纹理坐标x拾取绑定到纹理参考texRef 的线性内存的区域。不支持纹理过滤和寻址模式。对于整数型,这些函数将会将整数型转化为单精度浮点型。除了这些函数,还支持2-和4-分量向量的拾取。如:
texture<uchar4, 1, cudaReadModeNormalizedFloat> texRef,
int x);
用纹理坐标x拾取绑定到纹理参考的线性内存的区域。
从CUDA数组中拾取,是用函数tex1D(),tex2D(),tex3D():
Type tex1D(texture<Type, 1, readMode> texRef,float x);
template<class Type, enum cudaTextureReadMode readMode>
Type tex2D(texture<Type, 2, readMode> texRef,float x, float y);
template<class Type, enum cudaTextureReadMode readMode>
Type tex3D(texture<Type, 3, readMode> texRef,float x, float y, float z);
这些函数用用纹理坐标x,y,z拾取绑定到纹理参考 texRef 的CUDA数组。纹理参考的可变和不可变属性决定了如何理解坐标,在纹理拾取和返回值将做怎样的处理。
(三)拾取纹理内存与读取全局或常量内存相比的优点
1. 有高速缓存,如果CUDA数组中的纹理在片上的高速缓存中,则可以潜在的获得较高带宽
2. 不受访问模式的约束。全局或常量内存读取必须遵循相应访存模式才能获得好的性能。如全局内存在单个指令中将32-位、64-位或128-位从全局内存读取到寄存器,单个指令读取的位数要尽量多;另外每个半warp中同时访问全局内存地址的每个线程应该进行排列,以便内存访问可以合并到单个邻近的、对齐的内存访问中。
3. 寻址计算的延迟隐藏的更好,有时候会改善应用程序执行随机访问数据的性能。
4. 打包的数据可以在单个操作中广播到多个独立变量中
5. 8-位和16-位整数输入数据可以有选择地转化为[0.0,1.0]或[-1.0,1.0]区间内的32位浮点值
6. 如果访问的是CUDA数组还有其他的功能,过滤、归一化纹理坐标、寻址模式