10.1_简介

10.1 简介

在CUDA这个通用并行计算框架中,并不需要纹理的支持。鉴于其图形加速的传统功能,显卡上一般都配有纹理硬件。然而,在英伟达看来,支持硬件纹理单元将有助于许多操作的加速。尽管许多CUDA程序并没有使用纹理,但有时仍需依靠其使程序性能与CPU代码抗衡。

纹理映射是一种“将图片‘粉刷’到几何图形上从而创造更加丰富、看上去更加真实的物体的”技术。过去,硬件通常将纹理坐标与需要绘制的三角形X、Y、Z空间坐标绑定,然后以插值的方式将纹理“粉刷”到三角形面上(可选择双线性插值)。对于每个输出像素,从纹理图片中获取得到的对应值可以通过与插值得到的阴影参数进行混合,最终将混合得到的值输出到缓冲区中。随着可编程图形学的引入以及一些不包含颜色数据的类纹理数据的使用(如凹凸贴图),图形硬件变得愈加复杂。着色器程序通过使用TEX类似的指令来指定获取的坐标,从而使原本用来产生输出像素的着色器融入了计算功能。硬件通过使用纹理缓存以及针对局部空间而做出的内存结构优化,进一步提高了性能,并且通过特有硬件流水线将纹理坐标转换成硬件地址。

随着功能的日益丰富,程序的需求也结合了一些硬件成本的考虑,许多纹理操作特性显得并不是很灵活。例如,环绕纹理与镜面纹理的寻址模式必须在纹理坐标归一化的情况下才有效。本章对CUDA支持的硬件纹理单元进行了详细介绍,内容将涵盖归一化与非归一化坐标的寻址模式,线性插值的局限性,一维、二维、三维纹理和层纹理以及如何通过CUDA运行时API以及驱动程序API来使用这些特性。

两种使用方式

在CUDA中,纹理的使用有两种明显不同的方式。一种是只将纹理作为读取方式,以满足合并读取的约束或使用纹理缓存减少外部带宽需求。另一种则是利用GPU硬件在图形程序中具有固定功能的优势。硬件纹理单元具有一个可调控计算步骤的流水线,具体可以做的操作如下:

  • 对归一化的纹理坐标进行缩放;
    对纹理坐标执行边界条件计算;
    ·依据二维或三维局部性将纹理坐标转化为地址;
    ·为一维、二维或三维纹理获取2、4或8个纹理元素,并对它们进行线性插值;

  • 将纹理值从整型值转化为成组的浮点值。

纹理是通过绑定到底层内存的(CUDA数组或设备内存)纹理引用读取的。内存仅是一系列无格式的比特位。只有通过纹理引用,硬件才能正确解读数据,并在执行TEX指令时将数据传递到寄存器。

10.1_简介 - The CUDA Handbook | OpenTech