CUDA纹理与流式工作负载全解析
1. 2D纹理:避免复制
早期CUDA引入时,CUDA内核只能通过纹理从CUDA数组读取数据,应用程序只能通过内存复制写入CUDA数组。为了让CUDA内核写入后续通过纹理读取的数据,必须先写入设备内存,再进行设备 - 数组的内存复制。现在,针对2D纹理有两种机制可避免这一步骤:
- 2D纹理可绑定到按间距分配的线性设备内存范围。
- 表面加载/存储内建函数使CUDA内核能直接写入CUDA数组。
不过,不支持从设备内存进行3D纹理操作以及3D表面加载/存储。对于以规则访问模式读取大部分或全部纹理内容的应用(如视频编解码器),或者必须在Tesla级硬件上工作的应用,将数据保留在设备内存中是最佳选择。而对于在纹理操作时进行随机(但局部化)访问的应用,将数据保留在CUDA数组中并使用表面读写内建函数可能更好。
1.1 从设备内存进行2D纹理操作
从2D设备内存进行纹理操作不具备“块线性”寻址的优势,即纹理缓存的缓存行填充只会拉入水平方向的纹理元素,而非2D或3D块。但除非应用对纹理进行随机访问,否则避免从设备内存复制到CUDA数组的好处可能超过失去块线性寻址的损失。
要将2D纹理引用绑定到设备内存范围,可调用 cudaBindTexture2D() :
cudaBindTexture2D(
NULL,
&tex,
texDevice,
&channelDesc,
inWidth,
inHeight,
texPitch )
超级会员免费看
订阅专栏 解锁全文
2028

被折叠的 条评论
为什么被折叠?



