特性
纹理内存是只读的
纹理内存可以通过归一化坐标访问,当使用非归一化的坐标访问纹理时,不会进行filter
当访问纹理内存的模式具有较大的 “ 空间局部性 ” 时,性能会得到改善。这里的空间局部性不只是像素在水平方向(内存地址)上的连续性,也包括了竖直方向上的连续性
纹理内存为streaming featch(即同一个wrap中的所有thread同时访问具有空间局部性的一块内存)做了优化
即使全局内存为16位或32位的整型,当作为纹理内存进行访问时,能将数据转换为32位浮点类型
不论是纹理引用还是纹理对象的创建,都需要先在全局内存创建一个内存区域,然后将该内存与纹理对象或纹理引用绑定,最后kernel通过纹理对象或纹理引用访问纹理数据
如果在访问纹理期间修改与其绑定的全局内存,除非在读取纹理时发生cache miss,否则读取到的像素数据和全局内存中的不一致
Packed data may be broadcast to separate variables in a single operation;
纹理对象
纹理对象在运行时创建,并且在创建时与纹理内存进行绑定
__host __ cudaError_t cudaCreateTextureObject(cudaTextureObject_t* pTexObject, const cudaResourceDesc* pResDesc, const cudaTextureDesc* pTexDesc, const cudaResourceViewDesc* pResViewDesc) struct cudaTextureDesc { enum cudaTextureAddressMode addressMode[3]; //clamp?wrap? enum cudaTextureFilterMode filterMode; //linera?point? enum cudaTextureReadMode readMode; //是否将有/无符号整型像素化为【0,1】/【-1,1】范围内的浮点数 int sRGB; int normalizedCoords; //是否通过归一化坐标访问纹理 unsigned int maxAnisotropy; enum cudaTextureFilterMode mipmapFilterMode; float mipmapLevelBias; float minMipmapLevelClamp; float maxMipmapLevelClamp; }; struct cudaResourceDesc { cudaArray_t array; //原始数据 struct cudaChannelFormatD