bet*_*tch 3 textures caching cuda
有很多stackoverflow线程询问为什么使用纹理的内核不比使用全局内存访问的内核快.答案和评论对我来说似乎总是有点深奥.
Fermi架构通过为加载和存储实现单个统一内存请求路径来解决这一挑战,每个SM多处理器具有L1缓存,并为所有操作(加载,存储和纹理)提供统一的L2缓存.
那么为什么人们期望在费米设备上使用纹理存储器有任何加速,因为对于每次存储器获取(无论它是否与纹理绑定)都使用相同的L2高速缓存.实际上,对于大多数情况,直接访问全局内存应该更快,因为它也通过L1缓存,纹理提取不是.这也是关于stackoverflow的一些相关问题.
有人可以证实这一点或告诉我我缺少什么吗?
您忽略了每个Streaming Multiprocessor都有一个纹理缓存(请参见下图,说明Fermi的Streaming Multiprocessor).

纹理缓存与L1/L2缓存具有不同的含义,因为它针对数据局部性进行了优化.数据局部性适用于必须访问有关常规,笛卡尔,1D,2D或3D网格的语义(非物理)相邻点的数据的所有情况.为了更好地解释这个概念,请考虑下图,说明在2D或3D有限差分计算中涉及的模板

计算红点处的有限差分涉及访问与蓝点相关联的数据.现在,这些数据不是红点的物理邻居,因为当将2D或3D阵列展平为1D时,它们不会在物理存储器中连续地物理存储.然而,它们是红点的语义邻居,纹理记忆正好擅长缓存这些值.另一方面,当必须经常访问相同的数据或其物理邻居时,L1/L2高速缓存是好的.
奖牌的另一面是纹理缓存与L1/L2缓存相比具有更高的延迟,因此,在某些情况下,不使用纹理可能不会导致性能的显着恶化,这要归功于L1/L2缓存机制.从这个角度来看,纹理在早期的CUDA架构中具有最重要的意义,当时全局内存读取没有被缓存.但是,正如在1D纹理内存访问中所展示的访问速度快于1D全局内存访问?,费米的纹理记忆值得使用.
| 归档时间: |
|
| 查看次数: |
2364 次 |
| 最近记录: |