【发布时间】:2012-10-28 23:12:18
【问题描述】:
重写代码以便通过纹理缓存加载数据是否有意义(假设我不需要过滤和其他纹理单元选项)还是一样?如何通过 L1 缓存和一些槽纹理单元加载一些数据?我有一个可以使用这种策略的代码,但它是否有意义?
为了清楚起见,我的意思是,“FERMI 上的纹理缓存是与 L1 缓存硬件分开的硬件吗” - 换句话说,我能否巧妙地为我的代码获得 L1 + 纹理缓存的总容量?
【问题讨论】:
重写代码以便通过纹理缓存加载数据是否有意义(假设我不需要过滤和其他纹理单元选项)还是一样?如何通过 L1 缓存和一些槽纹理单元加载一些数据?我有一个可以使用这种策略的代码,但它是否有意义?
为了清楚起见,我的意思是,“FERMI 上的纹理缓存是与 L1 缓存硬件分开的硬件吗” - 换句话说,我能否巧妙地为我的代码获得 L1 + 纹理缓存的总容量?
【问题讨论】:
它是分开的。纹理加载不经过 L1。对于非纹理应用程序(即您不使用插值和钳位等功能),纹理的主要好处是它允许您有选择地添加大量可以潜在缓存的全局内存(假设局部性和重用)而不会中断L1 发生了什么。对于小型数据集,纹理不会提供比 L1 更好的性能。对于有一些局部性和重用性的大型数据集,但来自纹理缓存所覆盖区域的负载可能会破坏 L1(在 Fermi 上每个 SM 可能小至 16KB,具体取决于缓存配置),纹理缓存可以为整个应用程序带来好处。用户经常会体验到使用纹理的速度不如可以在 L1 中缓存的速度快,但比未缓存的加载或破坏 L1 的分散加载要快得多。很大程度上取决于所涉及的数据的访问模式和大小。每个 SM 纹理缓存的大小约为 8KB。您可以缓存更大的区域,但高水平的重用和局部性肯定会提高纹理缓存的性能。另请注意,纹理内存是只读的。您可能对此webinar 感兴趣。
【讨论】: