CUDA: FERMI架构中的纹理缓存和L1缓存是否分开?

8

将代码改写成通过纹理缓存加载数据(假设不需要过滤和其他纹理单元选项),是否有意义?还是一样的?将一些数据通过L1缓存加载,另一些通过纹理单元加载呢?我有一个代码可以使用这种策略,但这样做有意义吗?

更明确地说,我的意思是,"FERMI上的纹理缓存是否与L1缓存硬件分开" - 换句话说,我能否巧妙地为我的代码获取L1缓存+纹理缓存容量总和?

1个回答

12

它是独立的。纹理加载不经过L1。对于非纹理应用程序(即,您没有使用诸如插值和夹紧之类的功能),纹理的主要好处在于,它允许您有选择地添加大量的全局内存,可以潜在地进行缓存(假设具有局部性和重用),而不会干扰L1中正在进行的操作。对于小数据集,纹理将无法比L1提供更好的性能。对于大型数据集,在该数据集中存在某些局部性和重用,并且来自纹理缓存覆盖区域的负载可能会破坏L1(取决于缓存配置,在Fermi上每个SM的大小可能仅为16KB),纹理缓存可以总体上为应用程序提供帮助。用户经常会发现,使用纹理并不像在L1中缓存东西那样快,但比未缓存的负载或弥散的负载快得多,这取决于访问模式和涉及的数据大小。纹理缓存的大小大约为每个SM的8KB。您可以缓存一个更大的区域,但高水平的重用和局部性肯定会提高纹理缓存的性能。还要注意,纹理内存是只读的。您可能会对这个 网络研讨会 感兴趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接