CUDA:FERMI上的纹理缓存是否与L1缓存分开?

时间:2012-10-28 13:27:04

标签: caching cuda textures

重写代码是否有意义,以便通过纹理缓存加载数据(假设我不需要过滤和其他纹理单元选项)或它是否相同?如何通过L1缓存和一些槽式纹理单元加载一些数据?我有一个代码,我可以使用这样的策略,但它有意义吗?

为了说清楚,我的意思是,“FERMI上的纹理缓存是一个与L1缓存硬件不同的硬件” - 换句话说,我可以巧妙地为我的代码获得总共L1 +纹理缓存量吗?

1 个答案:

答案 0 :(得分:11)

它是分开的。纹理加载不通过L1。对于非纹理应用程序(即,您没有使用插值和钳位等功能),纹理的主要好处是它允许您有选择地添加大量可以缓存的全局内存(假设位置和重用)而不会中断L1中发生了什么。对于小型数据集,纹理化不会提供比L1更好的性能。对于存在一些局部性和重用的大型数据集,但是纹理高速缓存覆盖的区域的负载可能会破坏L1(根据高速缓存配置,可能在Fermi上每SM小到16KB),纹理缓存可以为整个应用程序提供一个好处。对于用户而言,使用纹理的速度并不像在L1中缓存的情况那么快,但是比未缓存的负载快得多,或者分散负载会使L1崩溃的情况并不少见。很大程度上取决于所涉及的数据的访问模式和大小。纹理缓存的大小大约为每个SM 8KB。您可以缓存更大的区域,但高水平的重用和位置肯定会提高纹理缓存的性能。另请注意,纹理内存是只读的。您可能对此webinar感兴趣。