3.2.4.3 纹理绑定
如参考手册中所解释的,运行时API有一个低级的C风格的接口和一个高级的C++风格的接口。texture类型是在高级API中定义的一个结构体,公有继承自在低级API中定义的textrueReference类型。textureReference定义如下:
1、normalized指定纹理坐标是否归一化;如果非零,纹理中所有元素可寻址的纹理坐标范围是[0,1],而不是[0,width-1],[0,height-1],或[0,depth-1],其中width, height和depth是纹理尺寸。
2、filterMode指定滤波模式,即纹理获取时,如何根据输入的纹理坐标计算返回值;filterMode 等于cudaFilterModePoint或cudaFilterModeLinear;如果是cudaFilterModePoint,则所返回的值为纹理坐标最接近输入纹理坐标的纹理元素;如果等于 cudaFilterModeLinear,则所返回的值为纹理坐标最接近输入纹理坐标的两个(针对一维纹理)、四个(针对二维纹理)或八个(针对三维纹理)纹理元素的线性插值;对于浮点型的返回值,cudaFilterModeLinear 是惟一的有效值。
3、addressMode 指定寻址模式,即如何处理越界的纹理坐标;addressMode 是一个尺寸为 3 的数组,其第一个、第二个和第三个元素各自指定第一个、第二个和第三个纹理坐标的寻址模式;寻址模式可等于 cudaAddressModeClamp,此时越界的纹理坐标将被钳位到有效范围之内,也可等于 cudaAddressModeWrap,此时越界的纹理坐标将被环绕到有效范围之内;cudaAddressModeWrap仅支持归一化的纹理坐标。
4、channelDesc 描述获取纹理时返回值的格式;channelDesc类型定义如下:
int x, y, z, w;
enum cudaChannelFormatKind f;
};
其中 x、y、z 和 w 是返回值各组件的位数,而 f 为:
a. cudaChannelFormatKindSigned,如果这些组件是有符号整型;
b. cudaChannelFormatKindUnsigned,如果这些组件是无符号整型;
c. cudaChannelFormatKindFloat,如果这些组件是浮点类型。
normalized、addressMode 和 filterMode 可直接在主机代码中修改。
在内核中使用纹理参考从纹理存储器中读取数据之前,必须使用 cudaBindTexture() 或 cudaBindTextureToArray() 将纹理参考绑定到纹理。cudaUnbindTexture()用于解绑定纹理参考。
下面的代码将纹理参考绑定到devPtr指针指向的线性存储器:
使用低级API:
textureReference* texRefPtr;
cudaGetTextureReference(&texRefPtr, “texRef”);
cudaChannelFormatDesc channelDesc =
cudaCreateChannelDesc<float>();
使用高级API
cudaChannelFormatDesc channelDesc =
cudaCreateChannelDesc<float>();
下面的代码将纹理绑定到CUDA数组cuArray:
使用低级API
textureReference* texRefPtr;
cudaGetTextureReference(&texRefPtr, “texRef”);
cudaChannelFormatDesc channelDesc;
cudaGetChannelDesc(&channelDesc, cuArray);
使用高级API
cudaBindTextureToArray(texRef, cuArray);
声明纹理参考时指定的参数必须与将纹理绑定到纹理参考时指定的格式匹配;否则纹理获取的结果没有定义。