CUDA 纹理入门
一、什么是CUDA纹理
CUDA纹理是NVIDIA GPU提供的一种特殊内存访问机制,它允许高效地访问和过滤结构化数据。纹理内存最初是为图形渲染设计的,但在通用计算(GPGPU)中也很有用。
二、纹理内存的优势
-
缓存优化:纹理内存有专用的缓存,适合空间局部性好的访问模式
-
硬件过滤:支持自动的线性插值等操作
-
边界处理:可以自动处理越界访问
-
多维访问:方便处理2D、3D数据
三、纹理引用操作纹理
基本使用步骤
1. 声明纹理引用
c
texture<DataType, Type, ReadMode> texRef;
DataType (数据类型)
-
uchar
,uchar2
,uchar4
-
schar
,char2
,char4
-
ushort
,ushort2
,ushort4
-
short
,short2
,short4
-
uint
,uint2
,uint4
-
int
,int2
,int4
-
float
,float2
,float4
Type (纹理类型)
-
cudaTextureType1D
: 一维纹理 -
cudaTextureType2D
: 二维纹理 -
cudaTextureType3D
: 三维纹理 -
cudaTextureTypeCubemap
: 立方体贴图 -
cudaTextureType1DLayered
: 分层一维纹理 -
cudaTextureType2DLayered
: 分层二维纹理
ReadMode (读取模式)
-
cudaReadModeElementType
: 直接读取元素类型 -
cudaReadModeNormalizedFloat
: 将整数类型归一化为[0.0, 1.0]或[-1.0, 1.0]的浮点数
示例:
c
texture<float, 2, cudaReadModeElementType> texRef;
cudaReadModeElementType
表示纹理将按照内存中的原始数据类型直接读取数据,不进行任何格式转换。与之相对的是cudaReadModeNormalizedFloat
,后者会将整数类型数据自动归一化为浮点数。
2. 纹理参数配置
地址模式 (addressMode)
控制纹理坐标超出[0,1]范围时的行为:
c
texRef.addressMode[0] = ...; // 第一维(x)的地址模式
texRef.addressMode[1] = ...; // 第二维(y)的地址模式
texRef.addressMode[2] = ...; // 第三维(z)的地址模式
可选值:
-
cudaAddressModeWrap
: 环绕模式(重复纹理)-
坐标1.25 → 0.25
-
坐标-0.25 → 0.75
-
-
cudaAddressModeClamp
: 钳制模式(边缘延伸)-
坐标1.25 → 1.0
-
坐标-0.25 → 0.0
-
-
cudaAddressModeMirror
: 镜像模式(交替重复)-
坐标1.25 → 0.75
-
坐标2.25 → 0.25
-
-
cudaAddressModeBorder
: 边界模式(返回零)-
超出范围的坐标返回(0,0,0,0)
-
过滤模式 (filterMode)
控制纹理采样的插值方式:
c
texRef.filterMode = cudaFilterModePoint; // 最近邻采样
texRef.filterMode = cudaFilterModeLinear; // 线性插值
-
cudaFilterModePoint
: 返回最接近纹理坐标的纹素 -
cudaFilterModeLinear
: 对2D纹理执行双线性插值,对1D纹理执行线性插值
注意:线性过滤需要浮点数据类型或cudaReadModeNormalizedFloat
模式
归一化坐标 (normalized)
c
texRef.normalized = true; // 使用[0,1]范围的归一化坐标
texRef.normalized = false; // 使用[0,width)或[0,height)的实际坐标
-
true
: 坐标自动归一化到[0,1]范围 -
false
: 使用实际像素坐标
其他高级参数
各向异性过滤 (maxAnisotropy)
c
texRef.maxAnisotropy = 1; // 默认值(各向同性过滤)
控制各向异性过滤的