8.5_纹理与表面操作
8.5 纹理与表面操作
读写纹理和表面的指令相对于其他指令涉及了更多隐秘的状态。参数,例如基地址、维度、格式和纹理内容的解释方式,都包含在一个header头结构中。header是一个中间数据结构,它的软件抽象被称作纹理引用(texture reference)或表面引用(surface reference)。当开发者操纵纹理或表面引用时,CUDA运行时和驱动程序必须翻译这些改变到header头结构中,纹理或表面指令引用会作为header的索引[1]。
在启动作用于纹理或表面的内核前,驱动程序必须确保所有的这些状态在硬件上设置正确。因此,启动一个这样的内核会花费稍长的时间。在费米架构中,纹理的读取通过一个专门的缓存子系统支持,独立于一级/二级缓存,同样的独立于常量内存。每一个SM有一个一级纹理缓存,并且每一个纹理处理集群(texture processor cluster, TPC)和图形处理集群(graphic processor cluster, GPC)都额外拥有一个二级纹理缓存。表面的读写则通过同样为全局内存传输提供服务的一级/二级缓存操作的。
开普勒架构有两个专门支持纹理的技术:通过纹理缓存结构读取全局内存而不需要绑定纹理引用的能力,和通过地址指定纹理header
头结构而不是使用索引指定的能力。第二个技术也被称作“无绑定纹理”。
在SM 3.5和之后的硬件中,使用纹理缓存来读取全局内存可以通过使用const—restrict指针实现,也可以显式的调用函数ldg(),这个函数在sm_35_intrinsics.h中被定义。
[1] SM 3.x添加了纹理对象(texture object),这使纹理和表面头信息可以由地址引用而不是索引。过去的硬件可以在内核中最多引用128项纹理或表面,但是在SM 3.x中,这一数量只受限于内存数量。