技术开发 频道

CUDA编程——纹理

  (二)纹理拾取函数

  纹理拾取函数是设备运行时函数。纹理存储的区间不同,拾取的方式也不同。

  从线性内存中拾取,使用的函数是tex1Dfetch()的函数簇。如:

template<class Type>

Type tex1Dfetch(

texture
<Type, 1, cudaReadModeElementType> texRef, int x);

float tex1Dfetch(

texture
<unsigned char, 1, cudaReadModeNormalizedFloat> texRef,

int x);

  这些函数用纹理坐标x拾取绑定到纹理参考texRef 的线性内存的区域。不支持纹理过滤和寻址模式。对于整数型,这些函数将会将整数型转化为单精度浮点型。除了这些函数,还支持2-和4-分量向量的拾取。如:

float4 tex1Dfetch(

texture
<uchar4, 1, cudaReadModeNormalizedFloat> texRef,

int x);

  用纹理坐标x拾取绑定到纹理参考的线性内存的区域。

  从CUDA数组中拾取,是用函数tex1D(),tex2D(),tex3D():

template<class Type, enum cudaTextureReadMode readMode>

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数组还有其他的功能,过滤、归一化纹理坐标、寻址模式

0