首先texture在硬件层次上是属于一块存储器,通过绑定操作,可以用纹理操作根据坐标去获取数据,然后进行相应的操作
但是我现在对于texture的理解是,它可以较快的读取数据,如果你需要进行滤波,使用texture是最合适的,但是如果你不需要滤波,我没想到它的使用与global memory相比有什么好处,好想找人讨论啊,感觉自己理解不够
代码层次上对于texture存储器的使用,主要有以下几个流程:
- 在所有函数定义前定义texture 参考
- 定义像元类型
- 分配texture存储容量
- 进行纹理绑定
- 在kernel函数中通过坐标获取texture存储器的数据,进行操作
首先我们看看定义texture参考
texture<Type,Dim,ReadMode> texRef;//声明纹理类型
/*
Type:返回值类型,这里是指的在kernel函数中使用纹理拾取函数对texture进行读取时返回的值,但是这个也跟ReadMode有关
Dim:指定纹理的维度,可选的值有1,2,3,这个需要与纹理操作函数的坐标对应
ReadMode:指定读取纹理模式,
ReadMode=cudaReadModeNormalizedFloat;//表示最终返回的值为float型,会映射到[0.0,1.0]
ReadMode=cudaReadModeElementType;//最终返回值不做任何处理
*/
//这也就是为什么写ref和拾取需要配合的原因
//纹理参考的属性
我们再看看texture的定义,可以看到它时一个结构体,不过结构体里面所有的成员变量都有默认值,但是又可以发现template在模板实例化的时候就确定了返回值类型,textTpye,以及ReadMode,其它的都是可变的,具体细节在写的时候注意下吧
template<class T, int texType = cudaTextureType1D, enum cudaTextureReadMode mode = cudaReadModeElementType>
struct __device_builtin_texture_type__ texture : public textureReference
{
#if !defined(__CUDACC_RTC__)
__host__ texture(int norm = 0,
enum cudaTextureFilterMode fMode = cudaFilterModePoint,
enum cudaTextureAddressMode aMode = cudaAddressModeClamp)
{
normalized = norm;
filterMode = fMode;
addressMode[0] = aMode;
addressMode[1] = aMode;
addressMode[2] = aMode;
channelDesc = cudaCreateChannelDesc<T>();
sRGB = 0;
}
__host__ texture(int norm,
enum cudaTextureFilterMode fMode,
enum cudaTextureAddressMode aMode,
struct cudaChannelFormatDesc desc)
{
normalized = norm;
filterMode = fMode;
addressMode[0] =