CUDA:纹理内存对于计算能力2.x和更新版本的访问速度仍然有用吗?

CUDA:纹理内存对于计算能力2.x和更新版本的访问速度仍然有用吗?,cuda,Cuda,我正在写一个图像处理应用程序,在那里我必须以非校准的方式获取像素数据 最初,我使用全局内存实现了我的算法。后来我用纹理记忆重新实现了它。令我惊讶的是,它变慢了!我想,也许cudamaloc/text1Dfetch样式有问题,所以我把它改为cudaArray/tex2D。没有什么变化 然后我偶然发现了Shane Cook的“CUDA编程”,他写道: 由于compute 1.x硬件没有缓存,因此每个SM 6–8K的纹理内存提供了 唯一一种在此类设备上真正缓存数据的方法。然而,随着费米的出现,它的温度

我正在写一个图像处理应用程序,在那里我必须以非校准的方式获取像素数据

最初,我使用全局内存实现了我的算法。后来我用纹理记忆重新实现了它。令我惊讶的是,它变慢了!我想,也许cudamaloc/text1Dfetch样式有问题,所以我把它改为cudaArray/tex2D。没有什么变化

然后我偶然发现了Shane Cook的“CUDA编程”,他写道:

由于compute 1.x硬件没有缓存,因此每个SM 6–8K的纹理内存提供了 唯一一种在此类设备上真正缓存数据的方法。然而,随着费米的出现,它的温度高达48K 一级缓存和高达768K的共享二级缓存,这使得其缓存使用了纹理内存 财产基本上已经过时。纹理缓存仍然存在于Fermi上,以确保向后兼容- 与前几代代码的兼容性

我有GeForce GT 620M(费米,计算第2.1章)


所以我需要专业人士的建议!我是否应该更深入地挖掘纹理内存及其纹理缓存以优化性能?或者我最好还是坚持使用全局内存和一级/二级缓存?

纹理在计算能力>=2.0的设备上确实很有用

纹理和CUDAArray可以使用存储在中的内存,由于更好的2D空间位置,因此可以实现更好的缓存命中率

纹理缓存与其他缓存是分开的。所以它有自己的专用内存和带宽,从中读取不会干扰其他缓存。如果一级/二级缓存上有很大的压力,这一点就变得非常重要

纹理还提供内置功能,如插值、各种寻址模式(钳制、包裹、镜像)和使用浮点坐标的规范化寻址。这些可以在没有任何额外成本的情况下使用,并且可以在需要这些功能的内核中大大提高性能

在早期的CUDA体系结构上,纹理和CUDA阵列不能由内核编写。在计算能力>=2.0的体系结构上,它们可以通过CUDA表面写入

确定是否应该在全局内存中使用纹理或常规缓冲区取决于内存的预期用途和访问模式。这将是具体项目

您使用的是费米体系结构,该设备已重新命名为6xx系列


对于那些在开普勒架构,看看NVIDIA的介绍。特别是幻灯片,
纹理性能
纹理缓存解锁
常量限制示例

我会说不。由于费米体系结构,缓存层次结构比纹理缓存工作得更好(至少在费米的一些测试中)。但是,纹理对于插值还是很有用的,可能对于某些涉及渲染的过程也是有用的(不是我的主题)。我认为这取决于您是否使用了纹理硬件的其他功能:主要是纹理寻址和过滤计算以及可选的升级到浮点。我至少编写了一个实际代码,其中使用纹理可以在sm_2x和sm_3x之间提供有用的加速,即使不使用纹理插值。使用纹理的好处是,该应用程序在2D矩阵中的数据访问模式更适合纹理缓存。换言之,我赞同罗杰的观点,即收益将是特定于项目的。