纹理缓存比L2缓存快吗?

时间:2014-04-10 21:51:54

标签: caching textures gpu

我正在使用纹理缓存来加速科学计算。我在想为什么纹理内存可以使代码更快。

一种可能性是纹理内存将L2缓存流量带到纹理缓存。如果纹理内存访问速度比L2缓存快,这是有意义的,但我还没有找到这样的基准。

有没有人知道这个?

2 个答案:

答案 0 :(得分:0)

我有一些基准可能会解释一些事情。两个使用CUDA在PC CPU和图形卡上执行相同的计算。还有另一个使用OpenMP。请注意,下面显示的G​​PU有128个内核和多个寄存器,这些内核可以提供出色的性能,而不是内存速度。

http://www.roylongbottom.org.uk/linux_cuda_mflops.htm

http://www.roylongbottom.org.uk/linux%20multithreading%20benchmarks.htm#anchor5

执行的算术运算形式为x [i] =(x [i] + a)* b - (x [i] + c)* d +(x [i] + e)* f,其中2每个输入数据字8或32次操作。使用的数组大小为0.1,1或1000万个4字节单精度浮点字。以下是一些结果的摘要。

对于生成CPU要使用的输出的计算,主要障碍是图形总线速度相对较慢。第一个结果涉及400 KB转移到显卡并返回2500次。使用仅与输出相同的数据时速度加倍。最快的是没有返回所有数据(可能是一些总和)。这里。 L2缓存的基于CPU的计算速度要快得多。

第二组使用来自CPU上RAM的数据,并且可能比不涉及数据传输的CUDA计算慢。接下来的两组数据每个数据字有32个操作,其中GPU内核的数量可以带来比使用CPU更好的性能。

最终计算包括在GPU上运行的循环控制,包括使用GPU共享内存(缓存)。为了获得最佳性能,应该有最小的数据输入和输出以及每个数据字的大量计算。

  AMD Phenom(tm) II X4 945 Processor  3000 MHz 4 Cores 
  GeForce GTS 250  with 16 Processors 128 cores 
  Global Memory 999 MB, Shared Memory/Block 16384 B, Max Threads/Block 512

                  GTS 250 ------------------------------   Phenom
  Test            4 Byte  Ops  Repeat   Seconds   MFLOPS   MFLOPS
                   Words  /Wd  Passes                     4 Threads

 Data in & out    100000    2    2500  1.035893      483    22321
 Data out only    100000    2    2500  0.514445      972
 Calculate only   100000    2    2500  0.082464     6063

 Data in & out  10000000    2      25  0.639933      781     3240
 Data out only  10000000    2      25  0.339051     1475
 Calculate only 10000000    2      25  0.041672    11999

 Data in & out    100000   32    2500  1.057142     7568    58670
 Data out only    100000   32    2500  0.531691    15046
 Calculate only   100000   32    2500  0.128706    62157

 Data in & out  10000000   32      25  0.644074    12421    45377
 Data out only  10000000   32      25  0.357000    22409
 Calculate only 10000000   32      25  0.062001   129029

 Extra tests - loop in main CUDA Function

 Calculate      10000000    2      25  0.050288     9943
 Shared Memory  10000000    2      25  0.009206    54313

 Calculate      10000000   32      25  0.050531   158320
 Shared Memory  10000000   32      25  0.046626   171580

答案 1 :(得分:0)

所有纹理事务也都流经L2缓存,所以一般来说,纹理很少比而不是L2。您可以将Kepler上的纹理缓存看作是只读数据的备用L1缓存。

纹理缓存的细节很复杂,并没有很好地记录,但它是一个非常高性能的缓存,特别是对于具有一定位置的流访问模式以及同一warp中不同线程之间的重用或线程块。

关于纹理缓存的一个重点是,与CPU L1缓存不同,它并不是真正旨在减少延迟。相反,它被设计成一个带宽聚合器"它聚合来自许多线程的同时加载,并尝试尽可能有效地将结果流回处理单元。这意味着内存系统可以在更少的总事务中获取相同数量的数据。

如果没有更多信息,很难说使用纹理缓存(例如通过Kepler上的ldg instrinsic)是否会提高任何特定访问模式的性能,但如果你的内核是带宽限制的,通常是值得一试。

关于您的具体观点,是的,在纹理缓存中遇到的数据不必转到L2。但是,再次由于纹理缓存的细节,这通常比带宽聚合的影响小,这导致发送到L2的总内存事务更少。